#include<bits/stdc++.h>
using namespace std;
const long long maxn=200010;
const long long inf=0x3f3f3f3f;
long long minv[4*maxn],a[maxn],tag[maxn];
void pushdown(long long id,long long l,long long r)
{
long long mid=(l+r)>>1;
tag[id*2]+=tag[id];
tag[id*2+1]=tag[id];
minv[id*2]+=tag[id]*(mid-l+1);
minv[id*2+1]+=tag[id]*(r-mid);
tag[id]=0;
}
void pushup(long long id){
minv[id]=minv[2*id]+minv[2*id+1];
return;
}
void build(long long id,long long l,long long r){
tag[id]=0;
if(l==r){
minv[id]=a[l];
return;
}
long long mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
pushup(id);
}
void update(long long ansl,long long ansr,long long id,long long l,long long r,long long x){
if(ansl<=l&&r<=ansr){
minv[id]+=x*(r-l+1);
tag[id]+=x;
return;
}
pushdown(id,l,r);
long long mid=(l+r)/2;
if(ansl<=mid) update(ansl,ansr,id*2,l,mid,x);
if(ansr>mid) update(ansl,ansr,id*2+1,mid+1,r,x);
pushup(id);
}
int query(long long id,long long l,long long r,long long x,long long y){
if(l>=x&&r<=y){
return minv[id];
}
long long mid=(l+r)/2;
long long ans=0;
pushdown(id,l,r);
if(x<=mid) ans+=query(id*2,l,mid,x,y);
if(y>mid) ans+=query(id*2+1,mid+1,r,x,y);
return ans;
}
int main(){
long long n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int x;
cin>>x;
if(x==1) {
int x1,y1,z1;
cin>>x1>>y1>>z1;
update(x1,y1,1,1,n,z1);
}
if(x==2){
int x2,y2;
cin>>x2>>y2;
cout<<query(1,1,n,x2,y2)<<endl;
}
}
return 0;
}