rt.
#include <iostream>
#define int long long
using namespace std;
using cint=const int;
int n,f,a[200001],val[800001],tag[800001];
void build(cint u,cint l,cint r) {
if(l==r) {val[u]=a[l];return;}
cint mid=(l+r)>>1;
build(u<<1,l,mid);
build((u<<1)+1,mid+1,r);
val[u]=val[u<<1]+val[(u<<1)+1];
}
void apply(cint u,cint l,cint r,const int x) {
val[u]+=(r-l+1)*x,tag[u]+=x;
}
void pushdown(cint u,cint l,cint r) {
if(tag[u]) {
cint mid=(l+r)>>1;
apply(u<<1,l,mid,tag[u]);
apply((u<<1)+1,mid+1,r,tag[u]);
tag[u]=0;
}
}
void upd(cint u,cint l,cint r,cint s,cint t,const int x) {
if(s<=l&&r<=t) {apply(u,l,r,x);return;}
pushdown(u,l,r);
cint mid=(l+r)>>1;
if(s<=mid) upd(u<<1,l,mid,s,t,x);
if(t>mid) upd((u<<1)+1,mid+1,r,s,t,x);
val[u]=val[u<<1]+val[(u<<1)+1];
}
int query(cint u,cint l,cint r,cint s,cint t) {
if(l>=r) return val[u];
pushdown(u,l,r);
cint mid=(l+r)>>1;
if(t<=mid) return query(u<<1,l,mid,s,t);
if(s>mid) return query((u<<1)+1,mid+1,r,s,t);
return query(u<<1,l,mid,s,t)+query((u<<1)+1,mid+1,r,s,t);
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false),
cout.tie(nullptr);
cin>>n>>f;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int op,l,r,k;f--;) {
cin>>op;
if(op==1) {
cin>>l>>r>>k;
upd(1,1,n,l,r,k);
} else if(op==2) {
cin>>k;
upd(1,1,n,1,1,k);
} else if(op==3) {
cin>>k;
upd(1,1,n,1,1,-k);
} else if(op==4) {
cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
} else cout<<query(1,1,n,1,1)<<'\n';
}
return 0;
}