#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int res=0,f=1;char c=getchar();
while(c<'0'||'9'<c){
if(c=='-') f=-1;
c=getchar();
}
while('0'<=c&&c<='9'){
res=(res<<3)+(res<<1)+c-'0';
c=getchar();
}
return f*res;
}
const int N=2e5+10;
int n,m,a[N];
struct Node{
long long sum,l,r,tag;
}t[N<<3];
inline void push_up(int p){
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline void build(int p,int l,int r){
t[p].tag=0;
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
inline int f(int p,int k){
t[p].tag+=k;
t[p].sum+=(t[p].r-t[p].l+1)*k;
}
inline int push_down(int p){
f(p<<1,t[p].tag);
f(p<<1|1,t[p].tag);
t[p].tag=0;
}
inline void updata(int p,int nl,int nr,int k){
if(nl<=t[p].l&&t[p].r<=nr){
f(p,k);
return;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(nl<=mid) updata(p<<1,nl,nr,k);
if(mid<nr) updata(p<<1|1,nl,nr,k);
push_up(p);
}
inline int query(int p,int nl,int nr){
int res=0;
if(nl<=t[p].l&&t[p].r<=nr){
return t[p].sum;
}
int mid=(t[p].l+t[p].r)>>1;
if(nl<=mid) res+=query(p<<1,nl,nr);
if(mid<nr) res+=query(p<<1|1,nl,nr);
return res;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++){
int op=read();
if(op==1){
int a=read(),b=read(),c=read();
updata(1,a,b,c);
}else if(op==2){
int a=read();
updata(1,1,1,a);
}else if(op==3){
int a=read();
updata(1,1,1,-a);
}else if(op==4){
int a=read(),b=read();
printf("%lld\n",query(1,a,b));
}else if(op==5){
printf("%lld\n",query(1,1,1));
}
}
return 0;
}