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