求调
#include <bits/stdc++.h>
#define int long long
using namespace std;
long long n,m,op,l,r,tree[1000000],lz[200000],a[200000],k;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int zuo(int x){
return x<<1;
}
int you(int x){
return x<<1|1;
}
void push_up(int x){
tree[x]=tree[zuo(x)]+tree[you(x)];
}
void push_down(int x,int l,int r){
int mid=(l+r)>>1;
lz[zuo(x)]+=lz[x];
lz[you(x)]+=lz[x];
tree[you(x)]=(r-mid)*lz[x];
tree[zuo(x)]=(mid-l+1)*lz[x];
lz[x]=0;
}
void update(int x,int l,int r,int ll,int rr,int kk){
if(l>=ll&&r<=rr){
lz[x]+=kk;
tree[x]+=(r-l+1)*kk;
return;
}
int mid=(l+r)>>1;
push_down(x,l,r);
if(ll<=mid) update(zuo(x),l,mid,ll,rr,kk);
if(rr>mid) update(you(x),mid+1,r,ll,rr,kk);
push_up(x);
}
int query(int x,int l,int r,int ll,int rr){
int ans=0;
if(l>=ll&&r<=rr) return tree[x];
int mid=(l+r)>>1;
push_down(x,l,r);
if(ll<=mid) ans+=query(zuo(x),l,mid,ll,rr);
if(rr>mid) ans+=query(you(x),mid+1,r,ll,rr);
return ans;
}
void build(int x,int l,int r){
lz[x]=0;
if(l==r){
tree[x]=a[l];
return;
}
int mid=(l+r)>>1;
build(zuo(x),l,mid);
build(you(x),mid+1,r);
push_up(x);
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
op=read();
if(op==1){
l=read();r=read();k=read();
update(1,1,n,l,r,k);
}
else if(op==2){
k=read();
update(1,1,n,1,1,k);
}
else if(op==3){
k=read();
update(1,1,n,1,1,-k);
}
else if(op==4){
l=read();r=read();
printf("%lld\n",query(1,1,n,l,r));
}
else{
printf("%lld\n",query(1,1,n,1,1));
}
}
return 0;
}