#include <bits/stdc++.h>
using namespace std;
#define int ll
#define ll long long
#define endl '\n'
const double PI = acos(-1.0);
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int modn = 998244353;
const int N = 1e5+5;
struct node{
int lazy;
int sum;
}segt[N*4];
int a[N];
void pushup(int rt){
segt[rt].sum=segt[rt*2].sum+segt[rt*2+1].sum;
}
void build(int l,int r,int rt){
if(l==r){
segt[rt].sum=a[l];
return;
}
int mid = (l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
//segt[rt].sum=segt[rt<<1].sum+segt[(rt<<1)+1].sum;
pushup(rt);
}
void pushdown(int ln,int rn,int rt){
if(segt[rt].lazy){
segt[rt*2].lazy+=segt[rt].lazy;
segt[rt*2+1].lazy+=segt[rt].lazy;
segt[rt*2].sum+=ln*segt[rt].lazy;
segt[rt*2+1].sum+=rn*segt[rt].lazy;
segt[rt].lazy=0;
}
}
void update(int l,int r,int nl,int nr,int rt,int x){
if(nl>=l&&nr<=r){
segt[rt].sum+=(nr-nl+1)*x;
segt[rt].lazy+=x;
return;
}
int mid = (nl+nr)/2;
pushdown(mid-l+1,r-mid,rt);
if(l<=mid) update(l,r,nl,mid,rt*2,x);
if(r>mid) update(l,r,mid+1,nr,rt*2+1,x);
pushup(rt);
}
int getsum(int l,int r,int nl,int nr,int rt){
if(nl>=l&&nr<=r){
return segt[rt].sum;
}
if(l>nr||r<nl) return 0;
int mid = (nl+nr)/2;
pushdown(mid-l+1,r-mid,rt);
int sum=0;
if(l<=mid) sum+=getsum(l,r,nl,mid,rt*2);
if(r>mid) sum+=getsum(l,r,mid+1,nr,rt*2+1);
return sum;
}
void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
while(m--){
int b,x,y,k;
cin>>b;
if(b==1){
cin>>x>>y>>k;
update(x,y,1,n,1,k);
}else{
cin>>x>>y;
cout<<getsum(x,y,1,n,1)<<endl;
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _=1;
//cin>>_;
//getchar();
while(_--){
solve();
}
return 0;
}