#include <cstdio>
#include <cctype>
#define Min(a,b) (a<b?a:b)
#define ll long long
#define LNF 0x9fffffffffffffff
inline int read() {
int s = 0, w = 1; char ch = getchar();
while (!isdigit(ch)) {if (ch == '-') w = -1; ch = getchar();}
while (isdigit(ch)) {s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar();}
return 1ll * w * s;
}
const int MAXN = 1e5+5;
int n, m;
ll a[MAXN];
struct node_tree {
#define lson (o << 1)
#define rson (o << 1 | 1)
ll sumv[MAXN << 2], minv[MAXN << 2];
ll addv[MAXN << 2];
inline void push_up(int o) {
sumv[o] = sumv[lson] + sumv[rson];
minv[o] = Min(minv[lson], minv[rson]);
}
inline void push_down(int o, int l, int r) {
if (!addv[o]) return ;
int mid = (l + r) >> 1;
addv[lson] += addv[o]; addv[rson] += addv[o];
minv[lson] += addv[o]; minv[rson] += addv[o];
sumv[lson] += (addv[o] * (mid - l + 1));
sumv[rson] += (addv[o] * (r - mid));
addv[o] = 0;
}
inline void build(int o, int l, int r) {
addv[o] = 0;
ll mid = (l + r) >> 1;
if (l == r) {sumv[o] = a[l]; return ;}
build(lson, l, mid); build(rson, mid + 1, r);
push_up(o);
}
inline void optadd(int o, int l, int r, int ql, int qr, ll v) {
if (ql <= l && r <= qr) {
sumv[o] += v * (r - l + 1);
minv[o] += v; addv[o] += v;
return ;
}
push_down(o, l, r);
ll mid = (l + r) >> 1;
if (ql <= mid) optadd(lson, l, mid, qr, ql, v);
if (qr > mid) optadd(rson, mid + 1, r, ql, qr, v);
push_up(o);
}
inline ll query_min(int o, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return minv[o];
ll ans = LNF;
push_down(o, l, r);
ll mid = (l + r) >> 1;
if (ql <= mid) ans = Min(ans, query_min(lson, l, mid, ql, qr));
if (qr > mid) ans = Min(ans, query_min(rson, mid + 1, r, ql, qr));
return ans;
}
inline ll query_sum(int o, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return sumv[o];
ll ans = 0;
push_down(o, l, r);
ll mid = (l + r) >> 1;
if (ql <= mid) ans += query_sum(lson, l, mid, ql, qr);
if (qr > mid) ans += query_sum(rson, mid + 1, r, ql, qr);
return ans;
}
}q;
inline void inp() {
n = read(), m = read();
for (int i = 1; i <= n; ++ i)
a[i] = read();
q.build(1, 1, n);
}
inline void work() {
while (m --) {
int pts, x, y, k;
pts = read();
x = read(), y = read();
switch (pts) {
case 1 :
k = read();
q.optadd(1, 1, n, x, y, k);
break;
case 2 :
printf("%lld\n", q.query_sum(1, 1, n, x, y));
break;
}
}
}
int main() {
inp();
work();
return 0;
}