#include<bits/stdc++.h>
using namespace std;
const int N=2e5+3;
long long c[N],num[N],tag[N],mu[N];
struct node{
int l,r;
}a[N];
int n,f;
void init(){
int k=sqrt(n);
for(int i=1;i<=n;i++){
a[i].l=a[i-1].r+1;
a[i].r=a[i-1].l+k;
}
if(a[k].r<n){
k++;
a[k].l=a[k-1].r+1;
a[k].r=n;
}
for(int i=1;i<=k;i++){
for(int j=a[i].l;j<=a[i].r;j++){
c[j]=i;
}
}
return;
}
void change(int kuai,int l,int r,int x){
for(int i=l;i<=r;i++){
num[kuai]+=x;
mu[i]+=x;
}
}
long long search(int kuai,int l,int r){
long long ans=0;
for(int i=l;i<=r;i++){
ans+=mu[i]+tag[i];
}
return ans;
}
void modify(int l,int r,int x){
if(c[l]==c[r]){
change(c[l],l,r,x);
return;
}
change(c[l],l,a[c[l]].r,x);
change(c[r],a[c[r]].l,r,x);
for(int i=c[l]+1;i<=c[r]-1;i++){
num[i]+=(a[i].r-a[i].l+1)*x;
tag[i]+=x;
}
}
long long query(int l,int r){
long long ans=0;
if(c[l]==c[r]){
ans+=search(c[l],l,r);
return ans;
}
ans+=search(c[l],l,a[c[l]].r);
ans+=search(c[r],a[c[r]].l,r);
for(int i=c[l]+1;i<=c[r]-1;i++){
ans+=num[i];
}
return ans;
}
int main(){
cin>>n>>f;
init();
for(int i=1;i<=n;i++){
cin>>mu[i];
num[c[i]]+=mu[i];
}
int op,k,l,r;
while(f--){
cin>>op;
if(op==1){
cin>>l>>r>>k;
modify(l,r,k);
}
else if(op==2){
cin>>k;
modify(1,1,k);
}
else if(op==3){
cin>>k;
modify(1,1,-k);
}
else if(op==4){
cin>>l>>r;
cout<<query(l,r)<<"\n";
}
else{
cout<<query(1,1)<<"\n";
}
}
return 0;
}