#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
typedef struct TreeNode{
int l,r,sum,add;
}TreeNode;
TreeNode tr[N*4];
int n,m,x,y,k,arr[N];
char opt;
void pushdown(int idx){
if(tr[idx].add){
tr[idx<<1].sum+=tr[idx].add*(tr[idx<<1].r-tr[idx<<1].l+1);
tr[idx<<1].add+=tr[idx].add;
tr[(idx<<1)|1].sum+=tr[idx].add*(tr[(idx<<1)|1].r-tr[(idx<<1)|1].l+1);
tr[(idx<<1)|1].add+=tr[idx].add;
tr[idx].add=0;
}
}
void update(int idx,int l,int r,int date){
if(l<=tr[idx].l&&r>=tr[idx].r){
tr[idx].sum+=(tr[idx].r-tr[idx].l+1)*date;
tr[idx].add+=date;
return ;
}
pushdown(idx);
int mid=(tr[idx].l+tr[idx].r)>>1;
if(l<=mid)update(idx<<1,l,mid,date);
if(r>mid)update(idx<<1|1,l,r,date);
pushdown(idx);
}
void pushup(int idx){
tr[idx].sum=tr[idx<<1].sum+tr[idx<<1|1].sum;
}
void build(int idx,int l,int r){
tr[idx].l=l;
tr[idx].r=r;
if(l==r){
tr[idx].sum=arr[l];
return ;
}
int mid=(l+r)>>1;
build(idx<<1,l,mid);
build(idx<<1|1,mid+1,r);
pushup(idx);
}
int query(int idx,int l,int r){
if(l<=tr[idx].l&&r>=tr[idx].r)return tr[idx].sum;
int mid=(tr[idx].l+tr[idx].r)>>1,res=0;
if(l<=mid)res+=query(idx<<1,l,mid);
if(r>mid)res+=query(idx<<1|1,mid+1,r);
return res;
}
signed main(){
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&arr[i]);
}
build(1,1,n);
for(int i=1;i<=m;++i){
cin>>opt;
scanf("%lld%lld",&x,&y);
switch(opt){
case '1':
scanf("%lld",&k);
update(1,x,y,k);
break;
case '2':
printf("%lld\n",query(1,x,y));
break;
}
}
}