#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n,f,a[200005];
int op,l,r,k;
int tre[8000005],lazy[8000005];
void push_up(int f){
tre[f]=tre[ls(f)]+tre[rs(f)];
}
void push_down(int f,int l,int r){
lazy[ls(f)]+=lazy[f];
lazy[rs(f)]+=lazy[f];
int mid=(l+r)>>1;
tre[ls(f)]+=(lazy[f]*(mid-l+1));
tre[rs(f)]+=(lazy[f]*(r-mid));
lazy[f]=0;
}
void build(int f,int l,int r){
if(l==r){
tre[f]=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls(f),l,mid);
build(rs(f),mid+1,r);
push_up(f);
}
void add(int f,int l,int r,int x,int y,int k){
push_down(f,l,r);
if(x<=l&&r<=y){
tre[f]+=k*(r-l+1);
lazy[f]+=k;
return ;
}
int mid=(l+r)>>1;
if(x<=mid) add(ls(x),l,mid,x,y,k);
if(y>mid) add(rs(x),mid+1,r,x,y,k);
push_up(f);
}
int query(int f,int l,int r,int x,int y){
if(x<=l&&r<=y){
return tre[f];
}
push_down(f,l,r);
int mid=(l+r)>>1;int ans=0;
if(x<=mid) ans+=query(ls(f),l,mid,x,y);
if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
return ans;
}
signed main(){
cin >> n >> f;
for(int i=1;i<=n;i++) cin >> a[i];
build(1,1,n);
while(f--){
cin >> op;
if(op==1){
cin >> l >> r >> k;
add(1,1,n,l,r,k);
}
else if(op==2){
cin >> k;
add(1,1,n,1,1,k);
}
else if(op==3){
cin >> k;
add(1,1,n,1,1,-k);
}
else if(op==4){
cin >> l >> r;
cout << query(1,1,n,l,r) << endl;
}
else{
cout << query(1,1,n,1,1) << endl;
}
}
return 0;
}