#include<bits/stdc++.h>
using namespace std;
#define lson rt*2
#define rson rt*2+1
#define midd (l+r)/2
const int maxn=2e5+6;
int n,f;
long long ans,tree[maxn<<2],lazy[maxn<<2];
void add(int rt){
tree[rt]=tree[lson]+tree[rson];
}
void pushup(int rt){
tree[rt]=tree[lson]+tree[rson];
}
void pushdown(int l,int r,int rt){
if(lazy[rt]){
lazy[lson]+=lazy[rt];
lazy[rson]+=lazy[rt];
int mid=midd;
tree[lson]+=lazy[rt]*(mid-l+1);
tree[rson]+=lazy[rt]*(r-mid);
lazy[rt]=0;
}
}
void biuld(int l,int r,int rt){
if(l==r){
cin>>tree[rt];
return;
}
int mid=midd;
biuld(1,mid,lson);
biuld(mid+1,r,rson);
pushup(rt);
}
void updata(int l,int r,int rt,int ql,int qr,int x){
if(ql<=l&&qr>=r){
tree[rt]+=x*(r-l+1);
lazy[rt]+=x;
return;
}
pushdown(l,r,rt);
int mid=midd;
if(mid>=qr)
updata(l,mid,lson,ql,qr,x);
else if(mid<ql)
updata(mid+1,r,rson,ql,qr,x);
else{
updata(l,mid,lson,ql,qr,x);
updata(mid+1,r,rson,ql,qr,x);
}
pushup(rt);
}
void update(int l,int r,int rt,int x,int val){
if(l==x&&r==x){
tree[rt]+=val;
return;
}
int mid=midd;
if(mid<r&&mid>=x)
update(1,mid,lson,x,val);
else
update(mid+1,r,rson,x,val);
add(rt);
}
void updete(int l,int r,int rt,int x,int val){
if(l==x&&r==x){
tree[rt]-=val;
return;
}
int mid=midd;
if(mid<r&&mid>=x)
update(1,mid,lson,x,val);
else
update(mid+1,r,rson,x,val);
add(rt);
}
long long queryzhu(int l,int r,int rt){
if(l==1&&r==1)return tree[rt];
queryzhu(1,midd,lson);
}
void query(int l,int r,int rt,int ql,int qr){
int mid=midd;
if(l>=ql&&r<=qr){
ans+=tree[rt];
return;
}
pushdown(rt,l,r);
if(qr<=mid)
query(1,mid,lson,ql,qr);
else if(ql>mid) query(mid+1,r,rson,ql,qr);
else{
query(1,mid,lson,ql,qr);
query(mid+1,r,rson,ql,qr);
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>f;
biuld(1,n,1);
for(int i=1,op,l,r,k;i<=f;i++){
cin>>op;
if(op==1){
cin>>l>>r>>k;
updata(1,n,1,l,r,k);
}
else if(op==2){
cin>>k;
update(1,n,1,1,k);
}
else if(op==3){
cin>>k;
updete(1,n,1,1,k);
}
else if(op==4){
ans=0;
cin>>l>>r;
query(1,n,1,l,r);
cout<<ans<<endl;
}
else if(op==5){
cout<<queryzhu(1,n,1)<<endl;
}
}
return 0;
}