WA70分求调

P3372 【模板】线段树 1

fly__sheep @ 2024-08-25 11:33:56

#include<cstdio>
using namespace std;
#define int long long
int a[400040],n,m,d[400040],t[400040],x,y,z;
int ans;
void add(int x,int y,int z){
    if(x==y){
        d[z]=a[x];
        return;
    }
    int p=((y-x)>>1)+x;
    add(x,p,z<<1);
    add(p+1,y,(z<<1)+1);
    d[z]=d[z<<1]+d[(z<<1)+1];
}
void c(int x,int y,int a,int b,int z){
    if(t[z]!=0){
        d[z]+=t[z]*(b-a+1);
        t[z*2]+=t[z];
        t[z*2+1]+=t[z];
        t[z]=0;
    }
    if(a>=x&&b<=y){
        ans+=d[z];
        return;
    }
    if(b<x||a>y)return;
    int p=((b-a)>>1)+a;
    c(x,y,a,p,z*2);
    c(x,y,p+1,b,z*2+1);
}
void v(int x,int y,int a,int b,int z,int k){
    if(a>=x&&b<=y){
        t[z]+=k;
        return;
    }
    if(b<x||a>y)return;
    if(b>y&&a<x){
        d[z]+=(y-x+1)*k;
    }
    else if(b>y){
        d[z]+=(y-a+1)*k;
    }
    else{
        d[z]+=(b-x+1)*k;
    }
    int p=((b-a)>>1)+a;
    v(x,y,a,p,z*2,k);
    v(x,y,p+1,b,z*2+1,k);
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    add(1,n,1);
    while(m--){
        scanf("%lld",&x);
        if(x==2){
            ans=0;
            scanf("%lld%lld",&x,&y);
            c(x,y,1,n,1);
            printf("%lld\n",ans);

        }
        else{
            scanf("%lld%lld%lld",&x,&y,&z);
            v(x,y,1,n,1,z);
        }
    }
    return 0;
}

by 天南星魔芋 @ 2024-08-25 11:36:40

@fly__sheep 数组小了,要 8 不是 4


|