#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct st{
	ll l,r;
	ll sum;
	ll tag;
} tree[2000001];
ll arr[2000001];
void pushup(ll sp){
	tree[sp].sum=tree[sp<<1].sum+tree[sp<<1|1].sum;
}
void pushdown(ll sp){
	ll mid=(tree[sp].r+tree[sp].l)>>1;
	tree[sp<<1].sum+=tree[sp].tag*(mid-tree[sp].l+1),tree[sp<<1|1].sum+=tree[sp].tag*(tree[sp].r-mid);
	tree[sp<<1].tag+=tree[sp].tag,tree[sp<<1|1].tag+=tree[sp].tag;
	tree[sp].tag=0;
}
void init(ll sp,ll l,ll r){
	tree[sp].l=l,tree[sp].r=r;
	if(l==r){
		tree[sp].sum=arr[l];
		return;
	}
	ll mid=(l+r)>>1;
	init(sp<<1,l,mid);init(sp<<1|1,mid+1,r);
	pushup(sp);
}
void add(ll sp,ll l,ll r,ll adn){
	if(tree[sp].l>=l&&tree[sp].r<=r){
		tree[sp].sum+=adn*(tree[sp].r-tree[sp].l+1);
		tree[sp].tag+=adn;
		return;
	}
	pushdown(sp);
	ll mid=(tree[sp].l+tree[sp].r)>>1;
	if(l<=mid)add(sp<<1,l,r,adn);
	if(mid<r)add(sp<<1|1,l,r,adn);
	pushup(sp);
}
ll query(ll sp,ll l,ll r){
	if(tree[sp].l>=l&&tree[sp].r<=r)return tree[sp].sum;
	pushdown(sp);
	ll mid=(tree[sp].l+tree[sp].r)>>1,sum=0;
	if(l<=mid)sum+=query(sp<<1,l,r);
	if(mid<r)sum+=query(sp<<1|1,l,r);
	return sum;
}
int main(){
	ll n,T;
	cin>>n>>T;
	for(ll i=1;i<=n;i++){
		cin>>arr[i];
	}
	init(1,1,n);
	while(T--){
		char mode;
		cin>>mode;
		if(mode=='1'){
			ll x,y,k;
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		else{
			ll x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	
}