#include <bits/stdc++.h>
using namespace std;
long long a[1000001];
class segtree {
private:
long long tree[4000004];
long long lazy[4000004];
inline long long lcp(long long p) {
return p << 1;
}
inline long long rcp(long long p) {
return (p << 1) + 1;
}
inline void push_up(long long p) {
tree[p] = tree[lcp(p)] + tree[rcp(p)];
}
inline void f(long long p, long long l, long long r, long long k) {
lazy[p] += k;
tree[p] += k * (r - l + 1);
}
public:
void init(long long p, long long l, long long r, long long *arr) {
if (l == r) {
tree[p] = arr[l];
return;
}
long long mid = (l + r) >> 1;
init(lcp(p), l, mid, arr), init(rcp(p), mid + 1, r, arr), push_up(p);
}
void add(long long p, long long l, long long r, long long &al, long long &ar, long long &k) {
if (l == r) {
tree[p] += k;
return;
}
if (lazy[p]) {
long long &lp = lazy[p];
tree[lcp(p)] += lp, tree[rcp(p)] += lp, lazy[lcp(p)] += lp, lazy[rcp(p)] += lp;
lp = 0;
}
if (al <= l and ar >= r) {
tree[p] += k, lazy[p] += k;
return;
}
long long mid = (l + r) >> 1;
if (al <= mid)
add(lcp(p), l, mid, al, ar, k);
if (ar > mid)
add(rcp(p), mid + 1, r, al, ar, k);
push_up(p);
}
long long get(long long p, long long l, long long r, long long &al, long long &ar) {
if (al <= l and r <= ar)
return tree[p];
if (lazy[p]) {
long long mid = (l + r) >> 1;
f(lcp(p), l, mid, lazy[p]);
f(rcp(p), mid + 1, r, lazy[p]);
}
long long mid = (l + r) >> 1;
long long ans = 0;
if (al <= mid)
ans += get(lcp(p), l, mid, al, ar);
if (ar > mid)
ans += get(rcp(p), mid + 1, r, al, ar);
return ans;
}
} stree;
int main() {
long long n, m;
scanf("%lld%lld", &n, &m);
for (long long i = 1; i <= n; i++)
scanf("%lld", a + i);
stree.init(1, 1, n, a);
while (m--) {
long long op;
scanf("%lld", &op);
if (op == 1) {
long long x, y;
long long k;
scanf("%lld%lld%lld", &x, &y, &k);
stree.add(1, 1, n, x, y, k);
} else {
long long x, y;
scanf("%lld%lld", &x, &y);
printf("%lld\n", stree.get(1, 1, n, x, y));
}
}
return 0;
}