#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;
		
	}
	
	
}




}