#include<bits/stdc++.h>
using namespace std;
int n,f,a[200010],ss=0;
inline void read(int &x)
{
x=0;
int f=1;
char ch;
ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
struct tree
{
int l;
int r;
long long s;
int add;
} t[800010];
void build(int q,int l,int r)
{
t[q].l=l;t[q].r=r;
if(l==r)
{
t[q].s=a[l];
return;
}
int m=(l+r)/2;
build(q<<1,l,m);
build(q<<1|1,m+1,r);
t[q].s=t[q<<1].s+t[q<<1|1].s;
}
void spread(int x)
{
if(t[x].add!=0)
{
t[x<<1].s+=(t[x<<1].r-t[x<<1].l+1)*t[x].add;
t[x<<1|1].s+=(t[x<<1|1].r-t[x<<1|1].l+1)*t[x].add;
t[x<<1].add+=t[x].add;
t[x<<1|1].add+=t[x].add;
t[x].add=0;
}
}
void change(int q,int l,int r,int j)
{
if(t[q].l>=l&&t[q].r<=r)
{
t[q].s+=(t[q].r-t[q].l+1)*j;
t[q].add+=j;
return;
}
spread(q);
int m=(t[q].l+t[q].r)/2;
if(m>=l) change(q*2,l,r,j);
if(m<r) change(q*2+1,l,r,j);
t[q].s=t[q*2].s+t[q*2+1].s;
}
long long ask(int q,int l,int r)
{
long long ans=0;
if(l<=t[q].l&&t[q].r<=r)
{
return t[q].s;
}
spread(q);
int m=(t[q].l+t[q].r)/2;
if(m>=l) ans+=ask(q<<1,l,r);
if(r>m) ans+=ask(q<<1|1,l,r);
return ans;
}
int main()
{
read(n);read(f);
for(register int i=1;i<=n;i++)
{
read(a[i]);
}
ss=a[1];
build(1,1,n);
int r,x,y,z;
for(register int i=1;i<=f;i++)
{
read(r);
if(r==1)
{
read(x);
read(y);
read(z);
if(x==1)
ss+=z;
change(1,x,y,z);
}
else if(r==2)
{
read(x);
ss+=x;
change(1,1,1,x);
}
else if(r==3)
{
read(x);
ss-=x;
change(1,1,1,x*-1);
}
else if(r==4)
{
read(x);read(y);
printf("%lld\n",ask(1,x,y));
}
else
{
printf("%lld\n",ask(1,1,1));
}
}
return 0;
}