线段树

struct TREE{
    int val[N*4],tag[N*4];
    void pushdown(int o,int l,int r){
        int x=tag[o];
        if(x){
            int mid=(l+r)/2;
            val[o*2]+=(mid-l+1)*x;
            val[o*2+1]+=(r-mid)*x;
            tag[o*2]+=x,tag[o*2+1]+=x,tag[o]=0;
        }
    }
    void build(int o,int l,int r){
        tag[o]=0;
        if(l==r){
            val[o]=a[l];
            return;
        }
        int mid=(l+r)/2;
        build(o*2,l,mid);
        build(o*2+1,mid+1,r);
        val[o]=val[o*2]+val[o*2+1];
    }
    void update(int o,int l,int r,int s,int t,int x){
        if(s<=l&&r<=t){
            val[o]+=x*(r-l+1);
            tag[o]+=x;
            return ;
        }
        pushdown(o,l,r);
        int mid=(l+r)/2;
        if(mid>=s) update(o*2,l,mid,s,t,x);
        if(mid<t) update(o*2+1,mid+1,r,s,t,x);
        val[o]=val[o*2]+val[o*2+1];
    }//a[p]+=x
    int he(int o,int l,int r,int s,int t){
        if(s<=l&&r<=t) return val[o];
        pushdown(o,l,r);
        int mid=(l+r)/2,res=0;
        if(mid>=s) res+=he(o*2,l,mid,s,t);
        if(mid<t) res+=he(o*2+1,mid+1,r,s,t);
        return res;
    }
}d;
posted @ 2022-01-19 14:45  hubingshan  阅读(20)  评论(0)    收藏  举报  来源