#include<iostream>
#define int long long
using namespace std;
const int N=1e5+5;
long long n,m,k[N],ans,t=1;
struct node{
int l,r,sum,tag;
}a[4*N];
void build(int l,int r,int u){
if(l==r){
a[u].sum=k[l];
return;
}
long long mid=(l+r)/2;
a[u].l=++t;
build(l,mid,a[u].l);
a[u].r=++t;
build(mid+1,r,a[u].r);
a[u].sum=a[a[u].r].sum+a[a[u].l].sum;
}
void pushup(int u){
a[u].sum=a[a[u].l].sum+a[a[u].r].sum;
}
void pushdown(int l,int r,int u){
int mid=(l+r)/2;
a[a[u].l].sum+=(mid-l+1)*a[u].tag;
a[a[u].r].sum+=(r-mid)*a[u].tag;
a[a[u].l].tag=a[u].tag;
a[a[u].r].tag=a[u].tag;
a[u].tag=0;
}
void update(int l,int r,int lc,int rc,int u,int w){
if(l==lc&&r==rc){
a[u].sum+=(r-l+1)*w;
a[u].tag+=w;
return;
}
int mid=(l+r)/2;
pushdown(l,r,u);
if(rc<=mid)update(l,mid,lc,rc,a[u].l,w);
else if(lc>mid)update(mid+1,r,lc,rc,a[u].r,w);
else {
update(l,mid,lc,mid,a[u].l,w);
update(mid+1,r,mid+1,rc,a[u].r,w);
}
pushup(u);
}
void query(int l,int r,int lc,int rc,int u){
if(l==lc&&r==rc){
ans+=a[u].sum;
return;
}
int mid=(l+r)/2;
if(rc<=mid)query(l,mid,lc,rc,a[u].l);
else if(lc>mid)query(mid+1,r,lc,rc,a[u].r);
else {
query(l,mid,lc,mid,a[u].l);
query(mid+1,r,mid+1,rc,a[u].r);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>k[i];
build(1,n,1);
for(int i=1;i<=m;i++){
int tot;
cin>>tot;
if(tot==1){
int l,r,w;
cin>>l>>r>>w;
update(1,n,l,r,1,w);
}
else {
int l,r;
cin>>l>>r;
query(1,n,l,r,1);
cout<<ans<<endl;
ans=0;
}
}
}
零分求调