#include<bits/stdc++.h>
#define ls (x*2)
#define rs (x*2+1)
#define ll long long
using namespace std;
const int N=1e5+5;
ll sum[N*4],tag[N*4];
int a[N];
void pushup(int x){
sum[x]=sum[ls]+sum[rs];
return ;
}
void pushdown(int x,int tl,int tr){
if(tag[x]){
ll &p=tag[x];
int mid=(tl+tr)/2;
tag[ls]+=p;
tag[rs]+=p;
sum[ls]+=p*(mid-tl+1);
sum[rs]+=p*(tr-mid);
p=0;
}
}
void qujianjia(int x,int tl,int tr,int l,int r,ll w){
if(tl>=l && tr<=r){
sum[x]+=(tr-tl+1)*w;
tag[x]+=w;
return ;
}
int mid=(tl+tr)/2;
pushdown(x,tl,tr);
if(mid>=l) qujianjia(ls,tl,mid,l,r,w);
if(mid<r) qujianjia(rs,mid+1,tr,l,r,w);
pushup(x);
}
void build(int x,int tl,int tr){
if(tl==tr){
sum[x]=a[tl];
return ;
}
int mid=(tl+tr)/2;
build(ls,tl,mid);
build(rs,mid+1,tr);
pushup(x);
}
int query(int x,int tl,int tr,int l,int r){
if(tl>=l && tr<=r) return sum[x];
int mid=(tl+tr)/2;
pushdown(x,tl,tr);
ll s=0;
if(mid>=l) s+=query(ls,tl,mid,l,r);
if(mid<r) s+=query(rs,mid+1,tr,l,r);
pushup(x);
return s;
}
int main(){
int n,m;
int t=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
while(m--){
scanf("%d",&t);
if(t==1){
int l=0,r=0;
ll k=0;
scanf("%d %d %d",&l,&r,&k);
qujianjia(1,1,n,l,r,k);
}
else {
int l=0,r=0;
scanf("%d %d",&l,&r);
cout<<query(1,1,n,l,r)<<endl;
}
}
return 0;
}