#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+5;
int a[MAXN];
int sgt[MAXN];
int lc[MAXN*4],rc[MAXN*4];
int tag[MAXN*4];
void pushdown(int i){
if(tag[i]){
sgt[i<<1]+=tag[i]*(rc[i<<1]-lc[i<<1]+1);
sgt[(i<<1)|1]+=tag[i]*(rc[(i<<1)|1]-lc[(i<<1)|1]+1);
tag[i<<1]+=tag[i];
tag[(i<<1)|1]+=tag[i];
tag[i]=0;
}
}
void build(int l,int r,int i){
lc[i]=l;
rc[i]=r;
if(l==r){
sgt[i]=a[l];
return;
}
int m=(l+r)>>1;
build(l,m,i<<1);
build(m+1,r,(i<<1)|1);
sgt[i]=sgt[i<<1]+sgt[(i<<1)|1];
}
void update(int l,int r,int i,int x){
if(l<=lc[i]&&rc[i]<=r){
sgt[i]+=x*(rc[i]-lc[i]+1);
tag[i]+=x;
return;
}
pushdown(i);
int m=(lc[i]+rc[i])>>1;
if(l<=m) update(l,r,i<<1,x);
if(r>m) update(l,r,(i<<1)|1,x);
sgt[i]=sgt[i<<1]+sgt[(i<<1)|1];
}
int query(int l,int r,int i){
if(l<=lc[i]&&rc[i]<=r){
return sgt[i];
}
pushdown(i);
int m=(lc[i]+rc[i])>>1;
int sum=0;
if(l<=m) sum+=query(l,r,i<<1);
if(r>m) sum+=query(l,r,(i<<1)|1);
return sum;
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
int op,l,r;
cin>>op>>l>>r;
if(op==1){
int x;
cin>>x;
update(l,r,1,x);
}else{
cout<<query(l,r,1)<<endl;
}
}
return 0;
}