#include<bits/stdc++.h>
using namespace std;
#define ls(x) ((x)*2)
#define rs(x) ((x)*2+1)
#define mid ((l+r)/2)
int n,q,p,x,y,k,w[100005];
struct seg {
int t[400005],lazy[400005],ans[400005];
void f(int x,int l,int r,int k) {
lazy[x]+=k;
ans[x]+=k*(r-l+1);
}
void push_up(int x) {
t[x]=t[ls(x)]+t[rs(x)];
}
void push_down(int x,int l,int r) {
f(ls(x),l,mid,lazy[x]);
f(rs(x),mid+1,r,lazy[x]);
lazy[x]=0;
}
void build(int x,int l,int r) {
if(l==r) {
t[x]=w[l];
return;
}
build(ls(x),l,mid);
build(rs(x),mid+1,r);
push_up(x);
}
void update(int x,int l,int r,int L,int R,int k) {
if(l>=L&&r<=R) {
ans[x]+=k*(r-l+1);
lazy[x]+=k;
return;
}
push_down(x,l,r);
if(L<=mid)update(ls(x),l,mid,L,R,k);
if(R>mid)update(rs(x),mid+1,r,L,R,k);
push_up(x);
}
int query(int x,int l,int r,int L,int R) {
if(l>=L&&r<=R) {
return ans[x];
}
int sum=0;
push_down(x,l,r);
if(L<=mid)sum+=query(ls(x),l,mid,L,R);
if(R>mid)sum+=query(rs(x),mid+1,r,L,R);
return sum;
}
} a;
int main() {
cin>>n>>q;
for(int i=1; i<=n; i++) {
cin>>w[i];
}
a.build(1,1,n);
while(q--) {
cin>>p;
if(p==1) {
cin>>x>>y>>k;
a.update(1,1,n,x,y,k);
} else {
cin>>x>>y;
cout<<a.query(1,1,n,x,y)<<endl;
}
}
}