#include<bits/stdc++.h>
using namespace std;
long long d[500000<<2],laz[500000<<2],n,m=1;;
void build(){
while(m<=n)m<<=1;
for(long long i=m+1;i<=m+n;i++)cin>>d[i];
for(long long i=m-1;i>=1;i--)d[i]=d[i<<1]+d[i<<1|1];
}
long long get(long long x,long long y){
long long ans=0,lc=0,rc=0,cnt=1;//cnt=1
for(x+=m-1,y+=m+1; x^y^1; x>>=1,y>>=1,cnt<<=1){
if(laz[x])ans+=laz[x]*lc;
if(laz[y])ans+=laz[y]*rc;
if(~x&1)ans+=d[x^1],lc+=cnt;
if(y&1)ans+=d[y^1],rc+=cnt;
}
for(;x;x>>=1,y>>=1)ans+=laz[x]*lc,ans+=laz[y]*rc;
return ans;
}
void add(long long x,long long y,long long v){
long long ans=0,lc=0,rc=0,cnt=1;//cnt=1
for(x+=m-1,y+=m+1; x^y^1; x>>=1,y>>=1,cnt<<=1){
d[x]+=v*lc;d[y]+=v*rc;
if(~x&1) laz[x^1]+=v,d[x^1]+=v*cnt,lc+=cnt;
if(y&1) laz[y^1]+=v,d[y^1]+=v*cnt,rc+=cnt;
}
for(;x;x>>=1,y>>=1)d[x]+=v*lc,d[y]+=v*rc;
}
int main(){
long long q;
cin>>n>>q;
build();
while(q--){
long long a,b,op,c;
cin>>op>>a>>b;
if(op==1){
cin>>c;
add(a,b,c);
}else{
cout<<get(a,b)<<endl;
}
}
}