1 条题解

  • 2
    @ 2017-11-04 17:52:21
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <deque>
    #include <set>
    #include <limits>
    #include <string>
    #include <sstream>
    using namespace std;
    
    const int oo_min=0xcfcfcfcf,oo_max=0x3f3f3f3f;
    
    int n,m,st_size,st_cnt;
    int a[10000+1];
    int st_t[1000000+1];
    int st_l[1000000+1];
    int st_r[1000000+1];
    int st_mid[1000000+1];
    int st_lc[1000000+1];
    int st_rc[1000000+1];
    int st_max[1000000+1];
    
    void push_up_1(int now)
    {
        st_max[now]=max(st_max[st_lc[now]],st_max[st_rc[now]]);
    }
    
    void build_st_1(int &now,int l,int r)
    {
        if (now==0)
            now=++st_size;
        st_l[now]=l;
        st_r[now]=r;
        st_mid[now]=(l+r)/2;
        if (l==r)
            st_max[now]=a[l];
        else if (l<r)
        {
            if (l<=st_mid[now])
                build_st_1(st_lc[now],l,st_mid[now]);
            if (st_mid[now]+1<=r)
                build_st_1(st_rc[now],st_mid[now]+1,r);
            push_up_1(now);
        }
    }
    
    void copy_1(int now,int last)
    {
        st_l[now]=st_l[last];
        st_r[now]=st_r[last];
        st_mid[now]=st_mid[last];
        st_lc[now]=st_lc[last];
        st_rc[now]=st_rc[last];
        st_max[now]=st_max[last];
    }
    
    void update_st_1(int &now,int last,int p,int d)
    {
        now=++st_size;
        copy_1(now,last);
        if (st_l[now]==p&&p==st_r[now])
            st_max[now]=d;
        else
        {
            if (p<=st_mid[now])
                update_st_1(st_lc[now],st_lc[last],p,d);
            else if (st_mid[now]+1<=p)
                update_st_1(st_rc[now],st_rc[last],p,d);
            push_up_1(now);
        }
    }
    
    int sum_st_max_1(int now,int l,int r)
    {
        if (now==0)
            return oo_min;
        else if (st_l[now]==l&&r==st_r[now])
            return st_max[now];
        else if (r<=st_mid[now])
            return sum_st_max_1(st_lc[now],l,r);
        else if (st_mid[now]+1<=l)
            return sum_st_max_1(st_rc[now],l,r);
        else
            return max(sum_st_max_1(st_lc[now],l,st_mid[now]),sum_st_max_1(st_rc[now],st_mid[now]+1,r));
    }
    
    int main()
    {
        while (~scanf("%d%d",&n,&m))
        {
            for (int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            st_size=st_cnt=0;
            memset(st_t,0,sizeof(st_t));
            memset(st_l,0,sizeof(st_l));
            memset(st_r,0,sizeof(st_r));
            memset(st_mid,0,sizeof(st_mid));
            memset(st_lc,0,sizeof(st_lc));
            memset(st_rc,0,sizeof(st_rc));
            memset(st_max,0,sizeof(st_max));
            build_st_1(st_t[++st_cnt],1,n);
            for (int i=1;i<=m;i++)
            {
                int o,v,l,r,d;
                scanf("%d%d",&o,&v);
                if (o==0)
                {
                    scanf("%d%d",&l,&r);
                    printf("%d\n",sum_st_max_1(st_t[v],l,r));
                }
                else if (o==1)
                {
                    scanf("%d%d",&l,&d);
                    update_st_1(st_t[++st_cnt],st_t[v],l,d);
                }
            }
        }
    }
    
  • 1

信息

难度
8
分类
数据结构 | 线段树函数式编程 点击显示
标签
递交数
21
已通过
4
通过率
19%
上传者