#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl cout << "\n"
const int N = 1e6 + 5;
int T = 1, n, m, a[N];
struct node{
int L, R, w, tag;
}tree[N * 4];
void pushup(int u){
tree[u].w = tree[u * 2].w + tree[u * 2 + 1].w;
}
void build(int u, int L, int R){
if (L == R){
tree[u].w = a[L];
return;
}
int m = (L + R) / 2;
build(u * 2, L, m);
build(u * 2 + 1, m + 1, R);
pushup(u);
}
void maketag(int u, int len, ll x){
tree[u].tag += x;
tree[u].w += x * len;
}
void pushdown(int u, int L, int R){
int m = (L + R) / 2;
maketag(u * 2, m - L + 1, tree[u].tag);
maketag(u * 2 + 1, R - m, tree[u].tag);
tree[u].tag = 0;
}
bool in(int l, int r, int L, int R){
return (l <= L) && (R <= r);
}
bool out(int l, int r, int L, int R){
return (L > r) || (R < l);
}
int query(int u, int L, int R, int l, int r){
if (in(l, r, L, R)){
return tree[u].w;
} else if (!out(l, r, L, R)){
int m = (L + R) / 2;
pushdown(u, L, R);
return query(u * 2, L, m, l, r) + query(u * 2 + 1, m + 1, R, l, r);
}
}
void update(int u, int L, int R, int l, int r, ll x){
if (in(l, r, L, R)){
maketag(u, R - L + 1, x);
} else if (!out(l, r, L, R)){
int m = (L + R) / 2;
pushdown(u, L, R);
update(u * 2, L, m, l, r, x);
update(u * 2 + 1, m + 1, R, l, r, x);
pushup(u);
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
while (T--){
cin >> n >> m;
for (int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, 1, n);
int op, l, r, k;
while (m--){
cin >> op >> l >> r;
if (op == 1){
cin >> k;
update(1, 1, n, l, r, k);
} else {
cout << query(1, 1, n, l, r);
endl;
}
}
}
return 0;
}