#include<cstdio>
using namespace std;
const int maxn = 100005;
int n,m,x,y,flag;
int l[4*maxn],r[4*maxn];
long long lazy[8*maxn],sum[4*maxn];
void build(int L,int R,int now) {
lazy[now] = 0;
l[now] = L;
r[now] = R;
if(L == R) {
scanf("%lld",&sum[now]);
return;
}
int mid = (L+R)/2;
build(L,mid,now*2);
build(mid+1,R,now*2+1);
sum[now] = sum[now*2] + sum[now*2+1];
}
long long query(int L,int R,int now) {
sum[now] += lazy[now] * (r[now] - l[now] + 1);
lazy[now*2] += lazy[now];
lazy[now*2+1] += lazy[now];
lazy[now] = 0;
if(l[now] == L && r[now] == R)return sum[now];
int mid = (l[now]+r[now])/2;
if(R <= mid) return query(L,R,now*2);
else if(L >= mid+1) return query(L,R,now*2+1);
else return query(L,mid,now*2)+query(mid+1,R,now*2+1);
}
void modify(int L,int R,long long d,int now){
if(l[now] == L && r[now] == R) {
lazy[now] += d;
return;
}
sum[now] += (long long)d*(R-L+1);
int mid = (l[now]+r[now])/2;
if(R <= mid) modify(L,R,d,now*2);
else if(L >= mid+1) modify(L,R,d,now*2+1);
else {
modify(L,mid,d,now*2);
modify(mid+1,R,d,now*2+1);
}
}
int main() {
scanf("%d%d",&n,&m);
build(1,n,1);
while(m) {
m--;
scanf("%d",&flag);
if(flag == 1) {
long long k;
scanf("%d%d%lld",&x,&y,&k);
modify(x,y,k,1);
}
if(flag == 2) {
scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y,1));
}
}
return 0;
}