#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int a[N],tree[N*4],tag[N*4];
void push_up(int now){
tree[now]=tree[now<<1]+tree[now<<1|1];
}
void func(int now,int l,int r,int k){
tag[now]+=k;
tree[now]+=(r-l+1)*k;
}
void push_down(int now,int l,int r){
int mid=l+r>>1;
func(now<<1,l,mid,tag[now]);
func(now<<1|1,mid+1,r,tag[now]);
tag[now]=0;
}
void change(int now,int l,int r,int L,int R,int k){
if(l==L&&r==R){
tag[now]+=k;
tree[now]+=k*(r-l+1);
return;
}
push_down(now,l,r);
int mid=l+r>>1;
if(R<=mid) change(now<<1,l,mid,L,R,k);
else if(L>mid) change(now<<1|1,mid+1,r,L,R,k);
else{
change(now<<1,l,mid,L,mid,k);
change(now<<1|1,mid+1,r,mid+1,R,k);
}
push_up(now);
}
int answer(int now,int l,int r,int L,int R){
if(l==L&&r==R) return tree[now];
push_down(now,l,r);
int mid=l+r>>1;
if(R<=mid) return answer(now<<1,l,mid,L,R);
else if(L>mid) return answer(now<<1|1,mid+1,r,L,R);
else return answer(now<<1,l,mid,L,mid)+answer(now<<1|1,mid+1,r,mid+1,R);
}
void build(int now,int l,int r){
if(l==r){
tree[now]=a[l];
return;
}
int mid=l+r>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
push_up(now);
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int opt;
cin>>opt;
if(opt==1){
int l,r,k;
cin>>l>>r>>k;
change(1,1,n,l,r,k);
}
else{
int l,r;
cin>>l>>r;
cout<<answer(1,1,n,l,r)<<endl;
}
}
return 0;
}