#include<iostream>
#include<cstdio>
using namespace std;
const long long maxn=1e5+10;
long long n,m;
long long a[maxn];
struct segment_tree{
struct Node{
long long l,r;
long long sum;
long long lz;
}tr[maxn*4];
void build(long long p,long long l,long long r){
tr[p]={l,r,0,0};
if(l==r){
tr[p].sum=a[l];
return ;
}
long long mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void add(long long p,long long l,long long r,long long k){
if(tr[p].r<=r&&tr[p].l>=l){
tr[p].sum+=k*(tr[p].r-tr[p].l+1);
tr[p].lz+=k;
return ;
}
pushdown(p);
if(tr[p<<1].r>=l) add(p<<1,l,r,k);
if(tr[p<<1|1].l<=r) add(p<<1|1,l,r,k);
tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void pushdown(long long p){
if(tr[p].lz!=0){
tr[p<<1].lz+=tr[p].lz;
tr[p<<1|1].lz+=tr[p].lz;
long long mid=tr[p].l+tr[p].r>>1;
tr[p<<1].sum+=tr[p].lz*(mid-tr[p<<1].l+1);
tr[p<<1|1].sum+=tr[p].lz*(tr[p<<1|1].r-mid);
tr[p].lz=0;
}
return ;
}
long long mysearch(long long i,long long l,long long r){
if(tr[i].l>=l && tr[i].r<=r)
return tr[i].sum;
if(tr[i].r<l || tr[i].l>r) return 0;
pushdown(i);
long long s=0;
if(tr[i*2].r>=l) s+=mysearch(i*2,l,r);
if(tr[i*2+1].l<=r) s+=mysearch(i*2+1,l,r);
return s;
}
}ST;
int main(){
scanf("%lld %lld",&n,&m);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
ST.build(1,1,n);
for(long long i=1;i<=m;i++){
long long op;
scanf("%lld",&op);
if(op==1){
long long x,y;
long long k;
scanf("%lld %lld %lld",&x,&y,&k);
ST.add(1,x,y,k);
}
else{
long long x,y;
scanf("%lld %lld",&x,&y);
printf("%lld\n",ST.mysearch(1,x,y));
}
}
}