#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned;
ll val[1 << 20];
ll add[1 << 20];
uint n, q, m, x, y, z;
#define root 0
inline ll query(uint l, uint r) {
ll ans(0);
uint siz = 1;
uint lsiz(0), rsiz(0);
for (l = n + l - 1, r = n + r + 1; l ^ r ^ 1; r >>= 1, l >>= 1, siz <<= 1) {
if (~l & 1) {
ans += val[l ^ 1];
lsiz += siz;
}
if (r & 1) {
ans += val[r ^ 1];
rsiz += siz;
}
if (add[l])ans += add[l] * lsiz;
if (add[r])ans += add[r] * rsiz;
}
for (; l; l >>= 1, r >>= 1) {
if (add[l])ans += add[l] * lsiz;
if (add[r])ans += add[r] * rsiz;
}
return ans;
}
inline void modify(uint l, uint r, ll d) {
uint siz = 1;
uint lsiz(0), rsiz(0);
for (l = n + l - 1, r = n + r + 1; l ^ r ^ 1; r >>= 1, l >>= 1, siz <<= 1) {
if (~l & 1) {
add[l ^ 1] += d;
val[l ^ 1] += siz * d;
lsiz += siz;
}
if (r & 1) {
add[r ^ 1] += d;
val[r ^ 1] += siz * d;
rsiz += siz;
}
}
for (; l; l >>= 1, r >>= 1) {
val[l ^ 1] += lsiz * d;
val[r ^ 1] += rsiz * d;
}
}
inline void init(uint n_) {
memset(add, 0, sizeof add);
memset(val, 0, sizeof val);
for (n = 1; n <= n_ + 1; n <<= 1);
for (uint i = 1; i <= n_; ++i)cin >> val[i | n];
for (uint i = n; i; --i)val[i] = val[i << 1] + val[(i << 1) | 1];
}
int main() {
cin >> m >> q;
init(m);
while (cin >> q >> x >> y) {
if (q == 1) {
cin >> z;
modify(x, y, z);
} else cout << query(x, y) << '\n';
}
return 0;
}