#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int N=2e5+10;
struct node{
int l,r;
ll sum;
ll lazy=0;
}tr[N*4];
int a[N];
int n,m;
inline void pushup(int u){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r)tr[u].sum=a[l];
else{
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
}
void pushdown(int u){
if(tr[u].lazy){
int a=tr[u].lazy;
tr[u<<1].sum+=a*(tr[u<<1].r-tr[u<<1].l+1);
tr[u<<1].lazy+=a;
tr[u<<1|1].sum+=a*(tr[u<<1|1].r-tr[u<<1|1].l+1);
tr[u<<1|1].lazy+=a;
tr[u].lazy=0;
}
}
void mdf(int u,int l,int k){
if(tr[u].l==tr[u].r&&tr[u].l==l){
tr[u].sum+=k;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)mdf(u<<1,l,k);
else mdf(u<<1|1,l,k);
pushup(u);
}
void modify(int u,int l,int r,int k){
if(l==r){
mdf(u,l,k);
return;
}
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].sum+=k*(tr[u].r-tr[u].l+1);
tr[u].lazy+=k;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify(u<<1,l,r,k);
if(r>mid)modify(u<<1|1,l,r,k);
pushup(u);
}
ll query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].sum;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid)return query(u<<1,l,r);
if(l>mid)return query(u<<1|1,l,r);
else return query(u<<1,l,r)+query(u<<1|1,l,r);
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
int t,l,r,k;
build(1,1,n);
while(m--){
cin>>t;
if(t==1){
cin>>l>>r>>k;
if(l>r)swap(l,r);
modify(1,l,r,k);
continue;
}
if(t==2){
cin>>k;
mdf(1,1,k);
continue;
}
if(t==3){
cin>>k;
mdf(1,1,-k);
continue;
}
if(t==4){
cin>>l>>r;
if(l>r)swap(l,r);
cout<<query(1,l,r)<<'\n';
continue;
}
cout<<query(1,1,1)<<'\n';
}
return 0;
}