#include<bits/stdc++.h>
#define ll long long
#define MAXN 500010
using namespace std;
ll a[500010];
ll n, m;
struct segement_tree{
struct node{
ll l, r, sum, lazy = 0;
} tree[4 * MAXN]; //线段树
void build(ll i,ll l,ll r)
{
tree[i].l = l;
tree[i].r = r;
if(l==r){
tree[i].sum = a[l];
return;
}
ll mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
}
void pushdown(ll i){
if(tree[i].lazy!=0){
tree[i<<1].lazy += tree[i].lazy;
tree[i<<1|1].lazy += tree[i].lazy;
tree[i<<1].sum += (tree[i<<1].r - tree[i<<1].l + 1) * tree[i].lazy;
tree[i << 1 | 1].sum += (tree[i << 1 | 1].r - tree[i << 1 | 1].l + 1) * tree[i].lazy;
tree[i].lazy = 0;
}
return;
}
ll sec_search(ll i,ll l,ll r){
if(tree[i].l>=l&&tree[i].r<=r)
return tree[i].sum;
if(tree[i].l>r||tree[i].r<l)
return 0;
pushdown(i);
ll s = 0;
if(tree[i<<1].r>=l)
s += sec_search(i << 1, l, r);
if(tree[i<<1|1].l<=r)
s += sec_search(i << 1 | 1, l, r);
return s;
}
void pt_modify(ll i,ll x,ll k){
if(tree[i].l==tree[i].r){
tree[i].sum += k;
return;
}
if(tree[i<<1].r>=x)
pt_modify(i << 1, x, k);
else
pt_modify(i << 1 | 1, x, k);
tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
}
void sec_modify(ll i,ll l,ll r,ll k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum += (tree[i].r - tree[i].l + 1) * k;
tree[i].lazy += k;
return;
}
pushdown(i);
if(tree[i<<1].r>=l)
sec_modify(i << 1, l, r, k);
if(tree[i<<1|1].l<=r)
sec_modify(i << 1|1, l, r, k);
}
ll pt_search(ll i,ll x){
if(tree[i].l==tree[i].r)
return tree[i].sum;
pushdown(i);
if(tree[i<<1].r>=x)
return pt_search(i << 1, x);
else
return pt_search(i << 1 | 1, x);
}
} st;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for (int i = 1; i <= n;i++)
cin >> a[i];
st.build(1, 1, n);
for (int i = 0; i < m;i++){
ll p, x, y, k;
cin >> p;
if(p==1){
cin >> x >> y >> k;
st.sec_modify(1, x, y, k);
}
else{
cin >> x >> y;
cout << st.sec_search(1, x, y) << '\n';
}
}
return 0;
}