#include <iostream>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <assert.h>
using namespace std;
inline void pass(){return;}
inline void hold(){while(1);}
#define endl "\n"
#define mp(a,b) make_pair(a,b)
#define ct(a) while(!a.empty()) a.pop()
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define cdb cerr<<"Debug: "
#define cwn cerr<<"Warn: "
#define debug(x) cerr<<"In Line "<<__LINE__<<": "<<#x<<" = "<<x<<"\n"
#define sp(a) fixed<<setprecision(a)
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#define ll long long
#define ull unsigned long long
#define ld long double
#define int ll
int _t,n,m,a[200005],tree[800005],lzy[800005];
inline void pushup(int u){tree[u]=tree[u*2]+tree[u*2+1];}
void build(int u,int l,int r){
if(l==r){
tree[u] = a[l];
return;
}
int mid=(l+r)>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
inline bool inrange(int l,int r,int ql,int qr){return (ql<=l)&&(r<=qr);}
inline bool outofrange(int l,int r,int ql,int qr){return (l>qr)||(r<ql);}
inline void maketag(int u,int ul,int ur,int uk){
lzy[u] += uk;
tree[u] += (ur-ul+1)*uk;
}
inline void pushdown(int u,int ul,int ur){
int mid=(ul+ur)>>1;
maketag(u*2,ul,mid,lzy[u]);
maketag(u*2+1,mid+1,ur,lzy[u]);
lzy[u] = 0;
}
int query(int u,int l,int r,int ql,int qr){
if(inrange(l,r,ql,qr)) return tree[u];
else if(!outofrange(l,r,ql,qr)){
int mid=(l+r)>>1;
pushdown(u,l,r);
return query(u*2,l,mid,ql,qr)+query(u*2+1,mid+1,r,ql,qr);
}
else return 0;
}
void update(int u,int l,int r,int ul,int ur,int uk){
if(inrange(l,r,ul,ur)) maketag(u,l,r,uk);
else if(!outofrange(l,r,ul,ur)){
int mid=(l+r)>>1;
pushdown(u,l,r);
update(u*2,l,mid,ul,ur,uk);
update(u*2+1,mid+1,r,ul,ur,uk);
pushup(u);
}
}
void solve(int testID){
cin >> n >> m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op;
cin >> op;
if(op==1){
int l,r,k;
cin >> l >> r >> k;
update(1,1,n,l,r,k);
}
else if(op==2){
int k;
cin >> k;
update(1,1,1,1,1,k);
}
else if(op==3){
int k;
cin >> k;
update(1,1,1,1,1,-k);
}
else if(op==4){
int l,r;
cin >> l >> r;
cout << query(1,1,n,l,r) << "\n";
}
else{
cout << query(1,1,n,1,1) << "\n";
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
_t = 1;
for(int ran=0;ran<_t;ran++) solve(ran);
fflush(stdout);
return 0;
}