#include<iostream>
#include<algorithm>
using namespace std;
long long n,m;
struct inval{
long long il,ir,num,lz;
}inv[400010];
long long a[100010];
void pushup(long long at){
inv[at].num=inv[at<<1].num+inv[(at<<1)|1].num;
return;
}
void pushdown(long long at){
inv[at<<1].lz=inv[(at<<1)|1].lz=inv[at].lz;
inv[at<<1].num+=inv[at].lz*(inv[at<<1].ir-inv[at<<1].il+1);
inv[(at<<1)|1].num+=inv[at].lz*(inv[(at<<1)|1].ir-inv[(at<<1)|1].il+1);
inv[at].lz=0;
return;
}
void build(long long l,long long r,long long at){
inv[at].il=l;inv[at].ir=r;inv[at].lz=0;
long long m=(l+r)>>1;
if(l==r){
inv[at].num=a[m];
return;
}
build(l,m,at<<1);
build(m+1,r,(at<<1)|1);
pushup(at);
return;
}
void update(long long l,long long r,long long dis,long long at){
if(l<=inv[at].il&&inv[at].ir<=r){
inv[at].num+=dis*(inv[at].ir-inv[at].il+1);
inv[at].lz+=dis;
return;
}
long long m=(inv[at].il+inv[at].ir)>>1;
pushdown(at);
if(l<=m)update(l,r,dis,at<<1);
if(m<r)update(l,r,dis,(at<<1)|1);
pushup(at);
return;
}
long long getn(long long l,long long r,long long at){
// cout<<l<<" "<<r<<" "<<at<<endl;
long long ans=0;
if(l<=inv[at].il&&inv[at].ir<=r)return inv[at].num;
long long m=(inv[at].il+inv[at].ir)>>1;
pushdown(at);
if(l<=m)ans+=getn(l,r,at<<1);
if(m<r)ans+=getn(l,r,(at<<1)|1);
return ans;
}
int main(){
cin>>n>>m;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(long long i=1,s,x,y,k;i<=m;i++){
cin>>s;
if(s==1){
cin>>x>>y>>k;
update(x,y,k,1);
}else{
cin>>x>>y;
cout<<getn(x,y,1)<<endl;
}
}
return 0;
}