rt
#include<bits/stdc++.h>
using namespace std;
#define lc p<<1
#define rc p<<1|1
const int N=5e5+5;
int w[N];
struct node {
int l,r,sum,lazzy;
} tr[N*4];
void build(int p,int l,int r) {
tr[p]= {l,r,w[l]};
if(r==l) return;
int m=r+l>>1;
build(lc,l,m);
build(rc,m+1,r);
tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void pushup(int p) {
tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void pushdown(int p) {
tr[lc].sum=tr[lc].lazzy*(tr[lc].r-tr[lc].l-1);
tr[rc].sum=tr[rc].lazzy*(tr[rc].r-tr[rc].l-1);
tr[lc].lazzy+=tr[p].lazzy;
tr[rc].lazzy+=tr[p].lazzy;
tr[p].lazzy=0;
}
void update(int p,int x,int k) {
if(tr[p].l==x&&tr[p].r==x) {
tr[p].sum+=k;
return;
}
int m=tr[p].l+tr[p].r>>1;
if(x<=m) update(lc,x,k);
if(x>m) update(rc,x,k);
tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void update1(int p,int x,int y,int k) {
if(x<=tr[p].l&&y>=tr[p].r) {
tr[p].sum+=(tr[p].l-tr[p].r+1)*k;
tr[p].lazzy+=k;
return;
}
int m=tr[p].l+tr[p].r>>1;
pushdown(p);
if(x<=m) update1(lc,x,y,k);
if(y>m) update1(rc,x,y,k);
pushup(p);
}
int query(int p,int x,int y) {
if(x<=tr[p].l&&y>=tr[p].r) {
return tr[p].sum;
}
int m=tr[p].l+tr[p].r>>1;
int sum=0;
if(x<=m) sum+=query(lc,x,y);
if(y>m) sum+=query(rc,x,y);
return sum;
}
int n,m;
int a,x,y,k;
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>a;
if(a==1){
cin>>x>>y>>k;
update1(1,x,y,k);
}
if(a==2){
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}