#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[100005],tree[400005],lazy[400005];
void build(int p,int l,int r){
	lazy[p]=0; 
	if(l==r){
		tree[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tree[p]=tree[p*2]+tree[p*2+1];
}
void push_down(int p,int l,int r){
	if(lazy[p]){
		int mid=(l+r)>>1;
		tree[p*2]+=lazy[p]*(mid-l+1);
		lazy[p*2]+=lazy[p];
		tree[p*2+1]+=lazy[p]*(r-mid);
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0;
		return;
	}
	return;
}
void update(int p,int l,int r,int L,int R,int val){
	if(r<=R&&L<=l){
		lazy[p]+=val;
		tree[p]+=val*(r-l+1);
		return;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid)update(p*2,l,mid,L,R,val);
  	if(R>mid)update(p*2+1,mid+1,r,L,R,val);
  	tree[p]=tree[p*2]+tree[p*2+1];
  	return;
}
int query(int p,int l,int r,int L,int R){
	int sum=0;
	if(L>r||r<l)	return 0;
	if(L<=l&&r<=R) return tree[p];
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid)sum+=query(p*2,l,mid,L,R);
	if(R>mid)sum+=query(p*2+1,mid+1,r,L,R);
  	return sum;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)	cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			update(1,1,n,x,y,k);
		}
		else cout<<query(1,1,n,x,y)<<endl;
	}
	return 0;
}