#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Node {
int l,r;
int sum;
}tree[1000010];
int a[1000010];
int tag[1000010];
void build(int index, int left, int right) {
tree[index].l = left;
tree[index].r = right;
if(left == right) {tree[index].sum = a[left];return;}
build(index<<1, left, (left+right)/2);
build(index<<1+1, (left+right)/2+1, right);
tree[index].sum = tree[index<<1].sum + tree[index<<1+1].sum;
}
ll quire(int index, int left, int right) {
if(tree[index].r>left || tree[index].l>left)return 0;
tree[index].sum += (tree[index].r-tree[index].l+1)*tag[index];
tag[index<<1] += tag[index];
tag[index<<1+1] += tag[index];
tag[index] = 0;
if(tree[index].l>=left && tree[index].r<=right) {
return tree[index].sum;
}
ll ans = 0;
if(left<=(tree[index].l+tree[index].r)/2)
ans += quire(index<<1, left, right);
if(right>=(tree[index].l+tree[index].r)/2+1)
ans += quire(index<<1+1,left,right);
return ans;
}
void update (int index, int left, int right, int k) {
if(tree[index].r>left || tree[index].l>left)return;
if(tree[index].l>=left && tree[index].r<=right){
tag[index] += k;
return;
}
if(left<=(tree[index].l+tree[index].r)/2)update(index<<1, left,right,k);
if(right>=(tree[index].l+tree[index].r)/2+1)update(index<<1+1,left,right,k);
}
void solve() {
int n,q;cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int pd;cin>>pd;
if(pd==1){
int l,r,k;cin>>l>>r>>k;
update(1,l,r,k);
}else {
int l,r;cin>>l>>r;
cout<<quire(1,l,r)<<endl;
}
}
}
int main() {
ll T = 1;
while(T--)solve();
return 0;
}