过样例,全WA爆零
code
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=3e5;
struct node{int l,r;LL v,lazy;}f[maxn*4];
LL a[maxn];int n,q;
void pushup(int t){f[t].v=f[t<<1].v+f[t<<1|1].v;}
void pushdown(int t){
if(!f[t].lazy) return;
int l=f[t].l,r=f[t].r,m=(l+r)/2;
if(l!=m) f[t<<1].lazy=f[t].lazy;
if(m+1!=r) f[t<<1|1].lazy=f[t].lazy;
f[t<<1].v+=f[t].lazy*(m-l+1);
f[t<<1|1].v+=f[t].lazy*(r-m);
f[t].lazy=0;return;
}
void build (int t,int l,int r){
f[t].l=l,f[t].r=r;
if(l==r){f[t].v=a[l];return;}
int m=(l+r)/2;
build(t<<1,l,m);
build(t<<1|1,m+1,r);
pushup(t);
}
void add(int t,int ul,int ur,LL x){
int l=f[t].l,r=f[t].r;
if(ul<=l&&r<=ur){
f[t].v+=x*(r-l+1);
if(l!=r) f[t].lazy+=x;
return;
}
int m=(l+r)/2;pushdown(t);
if(m>=ul) add(t<<1,ul,ur,x);
if(m<ur) add(t<<1|1,ul,ur,x);
pushup(t);
}
LL getsum(int t,int ul,int ur){
int l=f[t].l,r=f[t].r;
if(ul<=l&&r<=ur) return f[t].v;
int m=(l+r)/2;LL rt=0;pushdown(t);
if(m>=ul) rt+=getsum(t<<1,ul,ur);
if(m<ur) rt+=getsum(t<<1|1,ul,ur);
return rt;
}
int main(){
scanf("%d%d",&n,&q,&a[0]);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
while(q--){
int c,l,r;LL k;scanf("%d",&c);
if(c==1||c==4) scanf("%d%d",&l,&r);
if(c<=3) scanf("%lld",&k);
if(c==1) add(1,l,r,k);
else if(c==2) add(1,1,1,k);
else if(c==3) add(1,1,1,-k);
else if(c==4) printf("%lld\n",getsum(1,l,r));
else if(c==5) printf("%lld\n",getsum(1,1,1));
}
return 0;
}