#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long tree[1000005];
long long a[100005];
long long tag[1000005];
void build(long long l,long long r,long long place){
if(l==r){
tree[place]=a[l];
return;
}
build(l,l+(r-l)/2,place*2);
build(l+(r-l)/2+1,r,place*2+1);
tree[place]=tree[place*2]+tree[place*2+1];
return;
}
void add(long long l,long long r,long long plus,long long userl,long long userr,long long p){
if(l<=userl && r>=userr){
tree[p]+=(userr-userl+1)*plus; tag[p]+=plus;
return;
}
long long mid=userl+(userr-userl)/2;
if(tag[p] && userl!=userr){
tree[p*2]+=tag[p]*(mid-userl+1); tree[p*2+1]+=tag[p]*(userr-mid);
tag[p*2]+=tag[p],tag[p*2+1]+=tag[p];
tag[p]=0;
}
if(l<=mid) add(l,r,plus,userl,mid,p*2);
if(r>mid) add(l,r,plus,mid+1,userr,p*2+1);
tag[p]=tag[p*2]+tag[p*2+1];
}
long long query(long long l,long long r,long long userl,long long userr,long long p){
if(l<=userl && r>=userr) return tree[p];
long long mid=userl+(userr-userl)/2;
if(tag[p]){
tree[p*2]+=tag[p]*(mid-userl+1),tree[p*2+1]=tag[p]*(userr-mid);
tag[p*2]+=tag[p],tag[p*2+1]+=tag[p];
tag[p]=0;
}
long long sum=0;
if(l<=mid) sum+=query(l,r,userl,mid,p*2);
if(r>mid) sum+=query(l,r,mid+1,userr,p*2+1);
return sum;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,n,1);
for(int i=1;i<=m;i++){
long long op; scanf("%lld",&op);
if(op==1){
long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
add(x,y,k,1,n,1);
}else if(op==2){
long long x,y; scanf("%lld %lld",&x,&y);
cout<<query(x,y,1,n,1)<<"\n";
}
}
return 0;
}