#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,a[N],ans[N<<2],tag[N<<2],op,x,y,k;
void push_up(int p){
ans[p]=ans[p<<1]+ans[p<<1|1];
}
void build(int p,int l,int r){
tag[p]=0;
if(l==r){ans[p]=a[l];return ;}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
void f(int p,int l,int r,int k){
tag[p]=tag[p]+k;
ans[p]=ans[p]+k*(r-l+1);
}
void push_down(int p,int l,int r){
int mid=(l+r)>>1;
f(p<<1,l,mid,tag[p]);
f(p<<1|1,mid+1,r,tag[p]);
tag[p]=0;
}
void modify(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&r<=nr){
ans[p]+=k*(r-l+1);
tag[p]+=k;
return ;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(nl<=mid)modify(nl,nr,l,mid,p<<1,k);
if(nr>mid) modify(nl,nr,mid+1,r,p<<1|1,k);
push_up(p);
}
int query(int q_x,int q_y,int l,int r,int p){
if(q_x>r||q_y<l)return 0;
if(q_x<=l&&r<=q_y)return ans[p];
int mid=(l+r)>>1;
push_down(p,l,r);
return (q_x<=mid?query(q_x,q_y,l,mid,p<<1):0)+(q_y>mid?query(q_x,q_y,mid+1,r,p<<1|1):0);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld%lld",&x,&y,&k);
modify(x,y,1,n,1,k);
}else if(op==2){
scanf("%lld",&k);
modify(1,1,1,1,1,k);
}else if(op==3){
scanf("%lld",&k);
modify(1,1,1,1,1,-k);
}else if(op==4){
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
}else {
printf("%lld\n",query(1,1,1,n,1));
}
}
}