#include <cstdio>
#include <iostream>
#define ls (x*2)
#define rs (x*2+1)
#define ll unsigned long long
using namespace std;
const int MAXN=1e6+5;
int n,m;
ll tree[MAXN],a[MAXN],tag[MAXN];
void pushup(int x){
tree[x]=tree[ls]+tree[rs];
}
void build(int x,int l,int r){
if(l==r){
tree[x]=a[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(x);
}
void pushdown(int l,int r,int x){
if(tag[x]){
ll &p=tag[x];
int mid=(l+r)>>1;
tag[ls]+=p,tag[rs]+=p;
tree[ls]+=p*(mid-l+1),tree[rs]+=p*(r-mid);
p=0;
}
}
void add(int l,int r,ll c,int tl,int tr,int x){
if(l<=tl&&tr<=r){
tree[x]+=(tr-tl+1)*c;
tag[x]+=c;
return;
}
int mid=(tl+tr)>>1;
pushdown(tl,tr,x);
if(mid>=l) add(l,r,c,tl,mid,ls);
if(r>mid) add(l,r,c,mid+1,tr,rs);
pushup(x);
}
ll query(int l,int r,int tl,int tr,int x){
if(l<=tl&&tr<=r) return tree[x];
int mid=(tl+tr)>>1;
pushdown(tl,tr,x);
ll sum=0;
if(l<=mid) sum+=query(l,r,tl,mid,ls);
if(r>mid) sum+=query(l,r,mid+1,tr,rs);
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
int p,x,y,k;
scanf("%d",&p);
if(p==1){
scanf("%d%d%d",&x,&y,&k);
add(x,y,k,1,n,1);
}
else{
scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}