#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2*1e5+10;
#define lp p<<1
#define rp p<<1|1
int n, f;
ll W[N];
struct Node {
int l, r;
ll sum, add;
ll len() {return r-l+1;}
bool in(int _l, int _r) {return (_l <= l && r <= _r);}
}ts[N<<2];
void pushup(int p) {
ts[p].sum = ts[lp].sum + ts[rp].sum;
}
void pushdown(int p) {
if (ts[p].add) {
ts[lp].sum += ts[lp].len() * ts[p].add;
ts[rp].sum += ts[rp].len() * ts[p].add;
ts[lp].add += ts[p].add;
ts[rp].add += ts[p].add;
ts[p].add = 0;
}
}
void build(int p, int l, int r) {
ts[p] = {l, r,W[l]};
if (l == r) return;
int mid = l + r >> 1;
build(lp, l, mid);
build(rp, mid+1, r);
pushup(p);
}
void update(int p, int l, int r, ll k) {
pushdown(p);
if (l <= ts[p].l && ts[p].r <= r) {
ts[p].sum += ts[p].len() * k;
ts[p].add += k;
return;
}
int mid = ts[p].l + ts[p].r >> 1;
if (l <= mid) update(lp, l, r, k);
if (r > mid) update(rp, l, r, k);
pushup(p);
}
void pointfix(int p, int x, ll k) {
if (ts[p].l == x && ts[p].r == x) {
ts[p].sum += k;
return;
}
int mid = ts[p].l + ts[p].r >> 1;
(x <= mid) ? pointfix(lp, x, k) : pointfix(rp, x ,k);
pushup(p);
}
ll query(int p, int l, int r) {
pushdown(p);
if (l <= ts[p].l && ts[p].r <= r) return ts[p].sum;
ll sum = 0;
int mid = ts[p].l + ts[p].r >> 1;
pushup(p);
if (l <= mid) sum += query(lp, l, r);
if (r > mid) sum += query(rp, l, r);
return sum;
}
void pt(int p) {
if (ts[p].l != ts[p].r) pt(lp);
cout<<ts[p].sum<<" ";
if (ts[p].l != ts[p].r) pt(rp);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>n>>f;
for (int i=1; i<=n; i++) cin>>W[i];
build(1, 1, n);
while(f--) {
int op; cin>>op;
if (op == 1) {
int l, r; ll k;
cin>>l>>r>>k;
update(1, l,r,k);
}
else if (op == 2) {
ll k; cin>>k;
pointfix(1,1,k);
}
else if (op == 3) {
ll k; cin>>k;
pointfix(1,1,-k);
}
else if (op == 4) {
int l, r; cin>>l>>r;
cout<<query(1,l, r)<<"\n";
}
else {
cout<<query(1,1,1)<<"\n";
}
}
}