求助线段树,样例没过,输出11 8 19
查看原帖
求助线段树,样例没过,输出11 8 19
409437
xiongjunxiang楼主2022/1/25 11:10

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=5e5;
int n,m,a,x,y,k;
struct Segment_tree{
#define ls o<<1
#define rs o<<1|1
    int t[N<<2],lz[N<<2];
    void pushup(int o){t[o]=t[ls]+t[rs];}
    void pushdown(int o){
        t[ls]+=lz[o]>>1,lz[ls]+=lz[o]>>1;
        t[rs]+=lz[o]>>1,lz[rs]+=lz[o]>>1;
        lz[o]=0;
    }
    void modify(int ql,int qr,int y,int l=1,int r=n,int o=1){
        if(ql<=l&&r<=qr){t[o]+=y*(r-l+1),lz[o]+=y*(r-l+1);return;}
        pushdown(o);
        int mid=l+r>>1;
        if(ql<=mid)modify(ql,qr,y,l,mid,ls);
        if(qr>mid) modify(ql,qr,y,mid+1,r,rs);
        pushup(o);
    }
    int query(int ql,int qr,int l=1,int r=n,int o=1){
        if(ql<=l&&r<=qr)return t[o];
        pushdown(o);
        int mid=l+r>>1,res=0;
        if(ql<=mid)res+=query(ql,qr,l,mid,ls);
        if(qr>mid) res+=query(ql,qr,mid+1,r,rs);
        return res;
    }
}T;
main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        scanf("%d",&x),
        T.modify(i,i,x);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&a,&x,&y);
        if(a==1){
            scanf("%d",&k);
            T.modify(x,y,k);
        }
        else printf("%d\n",T.query(x,y));
    }
}
2022/1/25 11:10
加载中...