#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef struct unit{
int l,r;
int sum;
int po=0;
}node;
int a[200005];
node t[800005];
void build(int x,int l,int r);
void add(int l,int r,int k,int x);
void change(int x,int p,int k);
void ask(int x,int p);
void spread(int x);
int toji(int l,int r,int x);
signed main()
{
int n,f;
cin>>n>>f;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
int y,l,r,k;
while(f--)
{
cin>>y;
if(y==1)
{
cin>>l>>r>>k;
add(l,r,k,1);
}
else if(y==2)
{
cin>>k;
change(1,1,k);
}
else if(y==3)
{
cin>>k;
change(1,1,-k);
}
else if(y==4)
{
cin>>l>>r;
int ans=toji(l,r,1);
cout<<ans<<endl;
}
else if(y==5)
{
ask(1,1);
}
}
}
void build(int x,int l,int r)
{
t[x].l=l;
t[x].r=r;
if(l==r)
{
t[p].sum=a[l];return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
void add(int l,int r,int k,int x)
{
if(t[x].r<l||t[x].l>r)return;
if(l<=t[x].l&&r>=t[x].r)
{
t[x].sum+=k*(t[x].r-t[x].l+1);
t[x].po+=k;
return;
}
spread(x);
int mid=(t[x].l+t[x].r)/2;
if(l<=mid)add(l,mid,k,x*2);
if(r>mid)add(mid+1,r,k,x*2+1);
t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
void change(int p,int x,int k)
{
t[x].sum+=k;
if(t[x].l==t[x].r){
return;
}
int mid=(t[x].l+t[x].r)/2;
if(p<=mid)change(p,x*2,k);
else change(p,x*2+1,k);
}
void ask(int x,int p)
{
spread(p);
if(t[p].l==t[p].r)
{
cout<<t[p].sum<<endl;
return;
}
int mid=(t[p].l+t[p].r)/2;
if(x<=mid)ask(x,p*2);
else ask(x,p*2+1);
}
void spread(int x)
{
if(t[x].po)
{
int mid=(t[x].l+t[x].r)/2;
t[x*2].sum+=t[x].po*(mid-t[x].l+1);
t[x*2+1].sum+=t[x].po*(t[x].r-mid);
t[x*2].po+=t[x].po;
t[x*2+1].po+=t[x].po;
t[x].po=0;
}
}
int toji(int l,int r,int x)
{
if(t[x].l>=l&&t[x].r<=r)return t[x].sum;
if(r<t[x].l||l>t[x].r)return 0;
spread(x);
int mid=(t[x].l+t[x].r)/2;
int ans=0;
if(r>mid)ans+=toji(l,r,x*2+1);
if(l<=mid)ans+=toji(l,r,x*2);
return ans;
}