#include<bits/stdc++.h>
using namespace std;
struct pl{
	long long l,r,v,add,tim;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define v(x) tree[x].v
	#define add(x) tree[x].add
}tree[4*100000];
long long a[100001];
void build(long long p,long long l,long long r){
	l(p)=l;r(p)=r;
	if(l==r){
		v(p)=a[l];return;
	}
	long long mid=(l+r)>>1;
	build(p<<1,l,mid);
	build((p<<1)+1,mid+1,r);
	v(p)=v(p*2)+v(p*2+1);
}
void spread(long long p){
	if(add(p)==0)return;
	v(p*2)+=add(p)*(r(p*2)-l(p*2)+1);
	v(p*2+1)+=add(p)*(r(p*2+1)-l(p*2+1)+1);
	add(p*2)+=add(p);
	add(p*2+1)+=add(p);
	add(p)=0;
}
void chg(long long p,long long l,long long r,long long d){
	if(l<=l(p)&&r>=r(p)){
		v(p)+=d*(r(p)-l(p)+1);
		add(p)+=d;
		return;
	}
	spread(p);
	long long mid=(l(p)+r(p))>>1;
	if(l<=mid)chg(p*2,l,r,d);
	if(r>mid)chg(p*2+1,l,r,d);
	v(p)=v(p*2)+v(p*2+1);
}
long long ask(long long p,long long l,long long r){
	if(l<=l(p)&&r>=r(p))return v(p);
	spread(p);
	long long mid=(l(p)+r(p))>>1;
	long long ans=0;
	if(l<=mid)ans+=ask(p*2,l,r);
	if(r>mid)ans+=ask(p*2+1,l,r);
	return ans;
}
int main(){
long long i,j,n,m,t,k;
cin>>n>>m;
for(i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
	long long op,l,r,k;
	cin>>op>>l>>r;
	if(op==1){
		cin>>k;
		chg(1,l,r,k);
	}else cout<<ask(1,l,r)<<endl;	
}
}