#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n,q,a[maxn],sum[maxn<<2],lazy[maxn<<2],ans[maxn],t=1;
inline void pushup(int id)
{
sum[id]=sum[id<<1]+sum[id<<1|1];
}
inline void pushdown(int id, int l, int r)
{
if(lazy[id])
{
lazy[id<<1]+=lazy[id];
lazy[id<<1|1]+=lazy[id];
int mid=(l+r)>>1;
sum[id<<1]+=lazy[id]*(mid-l+1);
sum[id<<1|1]+=lazy[id]*(r-mid);
lazy[id]=0;
}
}
inline void build(int id,int l,int r)
{
if(l==r)
{
sum[id]+=a[l];
return;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
}
inline void update(int id,int l,int r,int x,int y,int v)
{
if(x<=l&&r<=y)
{
lazy[id]+=v;
sum[id]+=v*(r-l+1);
return;
}
pushdown(id,l,r);
int mid=(l+r)>>1;
if(x<=mid)
{
update(id<<1,l,mid,x,y,v);
}
if(y>mid)
{
update(id<<1|1,mid+1,r,x,y,v);
}
pushup(id);
}
inline int query(int id,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return sum[id];
}
pushdown(id,l,r);
int mid=(l+r)>>1;
int ans=0;
if(x<=mid)
{
ans+=query(id<<1,l,mid,x,y);
}
if(y>mid)
{
ans+=query(id<<1|1,mid+1,r,x,y);
}
return ans;
}
signed main()
{
n=read();
q=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
build(1,1,n);
int op,l,r,k;
while(q--)
{
op=read();
if(op==1)
{
l=read();
r=read();
k=read();
update(1,1,n,l,r,k);
}
if(op==2)
{
k=read();
update(1,1,n,l,r,k);
}
if(op==3)
{
k=read();
update(1,1,n,l,r,-k);
}
if(op==4)
{
l=read();
r=read();
ans[t++]=query(1,1,n,l,r);
}
if(op==5)
{
ans[t++]=query(1,1,n,1,1);
}
}
for(int i=1;i<t;i++)
{
printf("%d\n",ans[i]);
}
}