#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
long long a[400005];
long long sum[400005];
long long tag[400005];
long long lchild(long long p){
return (p << 1);
}
long long rchild(long long p){
return (p << 1) + 1;
}
void push_up(long long p){
sum[p] = sum[lchild(p)] + sum[rchild(p)];
return;
}
void buildtree(long long p, long long l, long long r){
if(l == r){
sum[p] = a[l];
return;
}
long long mid = ((l + r) >> 1);
buildtree(lchild(p), l, mid);
buildtree(rchild(p), mid + 1, r);
push_up(p);
}
void data(long long p, long long l, long long r, long long ql, long long qr, long long t){
if(l >= ql && r <= qr){
sum[p] += (r - l + 1) * t;
tag[p] += t;
return;
}
long long mid = ((l + r) >> 1);
if(mid >= ql){
data(lchild(p), l, mid, ql, qr, t);
}
if(mid < qr){
data(rchild(p), mid + 1, r, ql, qr, t);
}
push_up(p);
}
void movetag(long long p, long long l, long long r, long long t){
sum[p] += (r - l + 1) * t;
tag[p] += t;
return;
}
void push_down(long long p, long long l, long long r){
long long mid = ((l + r) >> 1);
movetag(lchild(p), l, mid, tag[p]);
movetag(rchild(p), mid + 1, r, tag[p]);
tag[p] = 0;
}
long long query(long long p, long long l, long long r, long long ql, long long qr){
// cout << "l, r = " << l << " " << r << endl;
if(l >= ql && r <= qr){
return sum[p];
}
push_down(p, l, r);
long long ans = 0;
int mid = ((l + r) >> 1);
if(mid >= ql){
ans += query(lchild(p), l, mid, ql, qr);
}
if(mid < qr){
ans += query(rchild(p), mid + 1, r, ql, qr);
}
return ans;
}
int main(){
long long n, m;
cin >> n >> m;
for(long long i = 1; i <= n; i++){
cin >> a[i];
}
buildtree(1, 1, n);
for(int i = 0; i < m; i++){
int op;
cin >> op;
if(op == 1){
long long x, y, k;
cin >> x >> y >> k;
data(1, 1, n, x, y, k);
} else{
long long x, y;
cin >> x >> y;
cout << query(1, 1, n, x, y) << endl;
}
}
return 0;
}