#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
int pos,n,m,x,y,k;
struct node{
int p,l,r,v,a;
}t[1000005<<2];
void up(int p){
t[p].v=t[ls].v+t[rs].v;
}
void down(int p){
if(!t[p].a) return;
t[ls].a+=t[p].a;
t[rs].a+=t[p].a;
t[ls].v+=t[p].a*(t[ls].r-t[ls].l+1);
t[rs].v+=t[p].a*(t[rs].r-t[ls].l+1);
t[p].a=0;
}
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
if(l==r){
cin>>t[p].v;
return;
}
int mid=l+(r-l>>1);
build(ls,l,mid);
build(rs,mid+1,r);
up(p);
}
void mdf(int p,int l,int r,int k){
if(l<=t[p].l&&t[p].r<=r){
t[p].a+=k;
t[p].v+=k*(t[p].r-t[p].l+1);
return;
}
down(p);
int mid=t[p].l+(t[p].r-t[p].l>>1);
if(l<=mid) mdf(ls,l,r,k);
if(r>mid) mdf(rs,l,r,k);
up(p);
}
int que(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r) return t[p].v;
down(p);
int res=0;
int mid=t[p].l+(t[p].r-t[p].l>>1);
if(l<=mid) res+=que(ls,l,r);
if(r>mid) res+=que(rs,l,r);
return res;
}
signed main(){
cin>>n>>m;
build(1,1,n);
while(m--){
cin>>pos;
if(pos==1){
cin>>x>>y>>k;
mdf(1,x,y,k);
}
else{
cin>>x>>y;
cout<<que(1,x,y)<<endl;
}
}
return 0;
}