样例过了,提交全爆0,求助qaq
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a[800005],sum[800005],add[800005],zhu=0,fzhu=0;
void build(ll k,ll l,ll r){
if(l==r){
sum[k]=a[l];
return;
}
ll mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
sum[k]=sum[k*2]+sum[k*2+1];
}
void addsom(ll k,ll l,ll r,ll x,ll y,ll v){
if(x<=l&&y>=r){
add[k]+=v;
return;
}
sum[k]+=(min(r,y)-max(l,x)+1)*v;
ll mid=(l+r)/2;
if(x<=mid) addsom(k*2,l,mid,x,y,v);
if(mid<y) addsom(k*2+1,mid+1,r,x,y,v);
}
ll check(ll k,ll l,ll r,ll x,ll y){
if(l>=x&&r<=y) return sum[k]+(r-l+1)*add[k];
ll mid=(l+r)/2;
ll ans=sum[k]+(min(r,y)-max(l,x)+1)*add[k];
if(x<=mid) ans+=check(2*k,l,mid,x,y);
if(mid<y) ans+=check(2*k+1,mid+1,r,x,y);
return ans;
}
int main(){
ll i,j,m,n,k,x,y,v;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
cin>>k;
if(k==1){
scanf("%lld%lld%lld",&x,&y,&v);
if(x<=1) fzhu+=v;
addsom(1,1,n,x,y,v);
}
if(k==2){
scanf("%lld",&v);
zhu+=v;
}
if(k==3){
scanf("%lld",&v);
zhu-=v;
}
if(k==4){
scanf("%lld%lld",&x,&y);
if(x<=1) printf("%lld\n",zhu+check(1,1,n,x,y));
else printf("%lld\n",check(1,1,n,x,y));
}
if(k==5){
printf("%lld\n",fzhu+zhu+a[1]);
}
}
return 0;
}