RT
# include <bits/stdc++.h>
# define int long long
using namespace std;
int n, m, a[200005];
struct Segment {
int w, p;
} t[800005] ;
inline void pushup (int u) {
t[u].w = t[u << 1].w + t[u << 1 | 1].w;
}
inline void build (int u, int l, int r) {
if (l == r) {
t[u].w = a[l];
return ;
}
int mid = (l + r) >> 1;
build (u << 1, l, mid);
build (u << 1 | 1, mid + 1, r);
pushup (u);
}
inline bool InRange (int l, int r, int L, int R) {
return (L <= l && r <= R);
}
inline bool OutOfRange (int l, int r, int L, int R) {
return (r < L || l > R);
}
inline void maketag (int u, int l, int r, int x) {
t[u].w += (r - l + 1) * x;
t[u].p += x;
}
inline void pushdown (int u, int l, int r) {
int mid = (l + r) >> 1;
maketag (u << 1, l, mid, t[u].p);
maketag (u << 1 | 1, mid + 1, r, t[u].p);
t[u].p = 0;
}
inline int query (int u, int l, int r, int L, int R) {
if (InRange (l, r, L, R)) return t[u].w;
if (OutOfRange (l, r, L, R)) return 0;
int mid = (l + r) >> 1;
pushdown (u, l, r);
return query (u << 1, l, mid, L, R) + query (u << 1 | 1, mid + 1, r, L, R);
}
inline void change (int u, int l, int r, int L, int R, int x) {
if (InRange (l, r, L, R)) maketag (u, l, r, x);
if (OutOfRange (l, r, L, R)) return ;
pushdown (u, l, r);
int mid = (l + r) >> 1;
change (u << 1, l, mid, L, R, x);
change (u << 1 | 1, mid + 1, r, L, R, x);
pushup (u);
}
signed main () {
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, l, r, x;
cin >> op;
if (op == 1) cin >> l >> r >> x;
if (op == 2 || op == 3) cin >> x;
if (op == 4) cin >> l >> r;
if (op == 1) change (1, 1, n, l, r, x);
if (op == 2) change (1, 1, n, 1, 1, x);
if (op == 3) change (1, 1, n, 1, 1, -x);
if (op == 4) cout << query (1, 1, n, l, r) << endl;
if (op == 5) cout << query (1, 1, n, 1, 1) << endl;
}
return 0;
}
/qdqd