#include<bits/stdc++.h>
#define gc getchar
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 10, M = sqrt(N) + 10;
inline int read() {
int x = 0; bool flag = 0; char ch = gc();
for (;!isdigit(ch); ch = gc()) flag |= ch == '-';
for (; isdigit(ch); ch = gc()) x = (x << 1) + (x << 3) + (ch ^ 48);
return flag ? ~(x - 1) : x;
}
int n, m, len;
ll a[N];
namespace decompose {
ll sum[M], add[M], leng[M];
#define pos(x) x/len
inline void change(int l, int r, int d) {
int x = pos(l), y = pos(r);
if (x == y) {
for (int i = l; i <= r; i ++)
a[i] += d, sum[x] += d;
return ;
}
int i = l, j = r;
while (pos(i) == x) a[i ++] += d, sum[x] += d;
while (pos(j) == y) a[j --] += d, sum[y] += d;
for (int k = pos(i); k <= pos(j); k ++)
sum[k] += (ll)len * d, add[k] += d;
}
inline ll query(int l, int r) {
ll res = 0;
int x = pos(l), y = pos(r);
if (x == y) {
for (int i = l; i <= r; i ++)
res += a[i] + add[x];
return res;
}
int i = l, j = r;
while (pos(i) == x) res += a[i ++] + add[x];
while (pos(j) == y) res += a[j --] + add[y];
for (int k = pos(i); k <= pos(j); k ++) res += sum[k];
return res;
}
}
int main() {
using namespace decompose;
n = read(), m = read(), len = sqrt(n);
for (int i = 1; i <= n; i ++)
sum[pos(i)] += a[i] = read(),
leng[pos(i)] ++;
int op, l, r, k;
for (int i = 1; i <= m; i ++) {
op = read();
switch (op) {
case 1 : l = read(), r = read(), k = read(); change(l, r, k); break;
case 2 : k = read(); change(1, 1, k); break;
case 3 : k = read(); change(1, 1, -k); break;
case 4 : l = read(), r = read(); printf("%lld\n", query(l, r)); break;
case 5 : printf("%lld\n", query(1, 1)); break;
}
}
return 0;
}