#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
int a[maxn<<4],lz[maxn];
void build(int k,int l,int r){
if(l==r){
cin>>a[k];return ;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
a[k]=a[k<<1]+a[k<<1|1];
}
void push_down(int k,int l,int r){
if(lz[k]){
lz[k<<1]+=lz[k];
lz[k<<1|1]+=lz[k];
int mid=l+r>>1;
a[k<<1]+=1ll*(mid-l)*lz[k];
a[k<<1|1]+=1ll*(r-mid+1)*lz[k];
lz[k]=0;
}
}
void updata(int k,int l,int r,int L,int R,int add){
if(l<=L&&r>=R){
a[k]+=(R-L+1)*add;
lz[k]+=add;
return ;
}
push_down(k,L,R);
int mid=L+R>>1;
if(l<=mid)
updata(k<<1,l,r,L,mid,add);
if(r>mid)
updata(k<<1|1,l,r,mid+1,R,add);
a[k]=a[k<<1]+a[k<<1|1];
}
ll query(int k,int l,int r,int L,int R){
if(l<=L&&r>=R)return a[k];
push_down(k,L,R);
int mid=L+R>>1;
ll sum=0;
if(l<=mid)
sum+=query(k<<1,l,r,L,mid);
if(r>mid)
sum+=query(k<<1|1,l,r,mid+1,R);
return sum;
}
int main()
{
int n,k;
cin>>n>>k;build(1,1,n);
while(k--){
int q,l,r,add;cin>>q;
if(q==1){//区间查询
cin>>l>>r;
cout<<query(1,l,r,1,n)<<endl;
}
else{//区间修改
cin>>l>>r>>add;
updata(1,l,r,1,n,add);
}
}
}