RE求调

P3372 【模板】线段树 1

leiaxiwo @ 2024-03-14 14:01:34

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100001],ans[100001],tag[100001];
long long ls(long long x){
    return x<<1;
}
long long rs(long long x){
    return x<<1|1;
}
void push_up(long long p){
    ans[p]=ls(ans[p])+rs(ans[p]);
}
void build(long long p,long long l,long long r){
    tag[p]=0;
    if(l==r){
        ans[p]=a[l];
        return ;
    }
    long long mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}
void f(long long p,long long l,long long r,long long k){
    tag[p]+=k;
    ans[p]=ans[p]-(r-l+1)*k;
}
void push_down(long long p,long long l,long long r){
    long long mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p]);
    f(rs(p),mid+1,r,tag[p]);
    tag[p]=0;
}
void update(long long nl,long long nr,long long l,long long r,long long p,long long k){
    if(nl<=l&&nr<=r){
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return ;
    }
    push_down(p,l,r);
    long long mid=(l+r)>>1;
    if(nl<=mid){
        update(nl,nr,l,mid,ls(p),k);
    }
    if(nr>mid){
        update(nl,nr,mid+1,r,rs(p),k);
    }
    push_up(p);
}
long long query(long long qx,long long qy,long long l,long long r,long long p){
    long long res=0;
    if(qx<=l&&qy<=r){
        return ans[p];
    }
    long long mid=(l+r)>>1;
    push_down(p,l,r);
    if(qx<=mid){
        res+=query(qx,qy,l,mid,ls(p));
    }
    if(qy>mid){
        res+=query(qx,qy,mid+1,r,rs(p));
    }
    return res;
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(long long i=1;i<=m;i++){
        long long opt;
        scanf("%lld",&opt);
        if(opt==1){
            long long x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            update(x,y,n,1,k,1);
        }
        if(opt==2){
            long long x,y;
            scanf("%lld%lld",&x,&y);
            long long ans2=query(x,y,1,n,1);
            printf("%lld",ans);
        }
    }
    return 0;
}

by L_zaa_L @ 2024-03-14 14:40:40

@liverxiwo if(nl<=l&&nr<=r)写错了


|