#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=2000005;
ll n,m,a[M*4],t[M*4],lazy[M*4];
inline void f(ll x,ll l,ll r,ll k)
{
lazy[x]+=k;
t[x]=t[x]+k*(r-l+1);
}
inline void down(ll l,ll r,ll x)
{
ll mid=(l+r)>>1;
f(x<<1,l,mid,lazy[x]);
f(x<<1|1,mid+1,r,lazy[x]);
lazy[x]=0;
}
inline void push_up(ll x)
{
t[x]=t[x<<1]+t[x<<1|1];
return ;
}
void build (ll l,ll r,ll x)
{
if(l==r) {
t[x]=a[l];return ;
}
ll mid=(l+r)>>1;
build(1,mid,x<<1);
build(mid+1,r,x<<1|1);
push_up(x);
}
inline void update(ll x,ll y,ll l,ll r,ll p,ll k)
{
if(x<=l&&r<=y){
t[p]+=(r-l+1)*k;
lazy[p]+=k;return ;
}
down(l,r,p);
ll mid=(l+r)>>1;
if(x<=mid) update(x,y,l,mid,p<<1,k);
if(y>mid) update(x,y,mid+1,r,p<<1|1,k);
push_up(p);
}
inline ll query(ll x,ll y,ll l,ll r,ll p)
{
ll res=0;
if(x<=l&&r<=y) return t[p];
down(l,r,x);
ll mid=(l+r)>>1;
if(x<=mid) res+=query(x,y,l,mid,p<<1);
if(y>mid) res+=query(x,y,mid+1,r,p<<1|1);
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
build(1,n,1);
while(m--){
ll p,x,y,k;
cin>>p;
if(p==1){
scanf("%lld%lld%lld",&x,&y,&k);
update(x,y,1,n,1,k);
}
if(p==2){
scanf("%lld",&k);
update(1,1,1,n,1,k);
}
if(p==3){
scanf("%lld",&k);
update(1,1,1,n,1,-k);
}
if(p==4){
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
}
if(p==5){
printf("%lld\n",query(1,1,1,n,1));
}
}
}