#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+1,inf=-2e18;
int n,m,i,gai[N],add[N],a[N],sum[N],x,y,z;
void Build(int l,int r,int rt){
if(l==r){
sum[rt]=a[l];
return;
}
int mid=(l+r)>>1;
Build(l,mid,rt*2);
Build(mid+1,r,rt*2+1);
sum[rt]=sum[rt*2]+sum[rt*2+1];
return ;
}
void PushDown(int rt,int ls,int rs){
add[rt*2]+=add[rt];
add[rt*2+1]+=add[rt];
sum[rt*2]+=add[rt]*ls;
sum[rt*2+1]+=add[rt]*rs;
add[rt]=0;
return ;
}
void XgDown(int rt,int ls,int rs){
gai[rt*2]=gai[rt];
gai[rt*2+1]=gai[rt];
sum[rt*2]=gai[rt]*ls;
sum[rt*2]=gai[rt]*ls;
gai[rt]=inf;
}
int Query(int l,int r,int L,int R,int rt){
if(l<=L&&R<=r) return sum[rt];
int mid=(L+R)>>1;
if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
if(gai[rt]==inf&&add[rt]) PushDown(rt,mid-L+1,R-mid);
if(r<=mid) return Query(l,r,L,mid,rt*2);
else if(l>=mid+1) return Query(l,r,mid+1,R,rt*2+1);
else return Query(l,mid,L,mid,rt*2)+Query(mid+1,r,mid+1,R,rt*2+1);
}
void Update(int l,int r,int s,int L,int R,int rt){
if(l<=L&&R<=r){
sum[rt]+=(r-l+1)*s;
if(gai[rt]!=inf) gai[rt]+=s;
else add[rt]+=s;
return ;
}
int mid=(L+R)>>1;
if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
if(gai[rt]==inf&&add[rt]) PushDown(rt,mid-L+1,R-mid);
if(r<=mid) Update(l,r,s,L,mid,rt*2);
else if(l>mid) Update(l,r,s,mid+1,R,rt*2+1);
else Update(l,mid,s,L,mid,rt*2),Update(mid+1,r,s,mid+1,R,rt*2+1);
sum[rt]=sum[rt*2]+sum[rt*2+1];
return ;
}
void Xgdate(int l,int r,int s,int L,int R,int rt){
if(l<=L&&R<=r){
sum[rt]+=(r-l+1)*s;
add[rt]+=s;
return ;
}
int mid=(L+R)>>1;
if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
if(gai[rt]==inf&&add[rt]) PushDown(rt,mid-L+1,R-mid);
if(r<=mid) Update(l,r,s,L,mid,rt*2);
else if(l>mid) Update(l,r,s,mid+1,R,rt*2+1);
else Update(l,mid,s,L,mid,rt*2),Update(mid+1,r,s,mid+1,R,rt*2+1);
sum[rt]=sum[rt*2]+sum[rt*2+1];
return ;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(i=1;i<=n;i++) cin>>a[i],gai[i]=inf;
Build(1,n,1);
while(m--){
int ch;
cin>>ch;
if(ch==1){
cin>>x>>y>>z;
Update(x,y,z,1,n,1);
}
else if(ch==2){
cin>>x>>y>>z;
Xgdate(x,y,z,1,n,1);
}
else{
cin>>x>>y;
cout<<Query(x,y,1,n,1)<<"\n";
}
}
return 0;
}
P1253 那错了?(样例没过)