#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, s[100005];
int k, l, r; ll v;
ll tree[200010], add[200010];
void maintain(int t){
tree[t] = tree[t << 1] + tree[t << 1 | 1];
}
void build(int l, int r, int t){
if(l == r){
tree[t] = s[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, t << 1);
build(mid + 1, r, t << 1 | 1);
maintain(t);
}
void pushdown(int t, int l, int r){
if(add[t]){
tree[t << 1] += (r - l + 2) / 2 * add[t];
tree[t << 1 | 1] += (r - l) / 2 * add[t];
add[t << 1] += add[t];
add[t << 1 | 1] += add[t];
add[t] = 0;
}
}
void update(int l, int r, int ql, int qr, int v, int t){
if(ql > r || qr < l)return;
if(ql <= l && r <= qr){
add[t] += v;
tree[t] += (ll)(r - l + 1) * v;
return;
}
pushdown(t, l, r);
int mid = (l + r) >> 1;
if(ql <= mid)update(l, mid, ql, qr, v, t << 1);
if(qr > mid)update(mid + 1, r, ql, qr, v, t << 1 | 1);
maintain(t);
}
ll query(int l, int r, int ql, int qr, int t){
// if(ql > r || qr < l)return 0;
if(ql <= l && r <= qr){
return tree[t];
}
pushdown(t, l, r);
int mid = (l + r) >> 1;
ll ans = 0;
if(ql <= mid)ans += query(l, mid, ql, qr, t << 1);
if(qr > mid)ans += query(mid + 1, r, ql, qr, t << 1 | 1);
return ans;
}
int main(){
freopen("in.txt", "r", stdin);
cin >> n >> m;
for(int i = 1; i <= n; ++i)cin >> s[i];
build(1, n, 1);
for(int i = 1; i <= m; ++i){
cin >> k >> l >> r;
if(k == 1){
cin >> v;
update(1, n, l, r, v, 1);
}else{
cout << query(1, n, l, r, 1) << endl;
}
}
return 0;
}