#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll _,x,y,k,n,m,a[101000],tree[101000<<2],laz[101000<<2];
priority_queue<ll>q;
void push_down(ll l,ll r,ll lx){
ll mid=(l+r)>>1;
tree[lx*2]+=(mid-l+1)*laz[lx];
tree[lx*2+1]+=(r-(mid+1)+1)*laz[lx];
laz[lx*2]=laz[lx];
laz[lx*2+1]=laz[lx];
laz[lx]=0;
}
void build(ll l,ll r,ll lx){
if(l==r){
tree[lx]=a[l];
return;
}
ll mid=(l+r)>>1;
build(l,mid,lx*2);
build(mid+1,r,lx*2+1);
tree[lx]=tree[lx*2]+tree[lx*2+1];
}
void add(ll l,ll r,ll addl,ll addr,ll addk,ll lx){
if(addl<=l&&r<=addr){
tree[lx]+=addk*(r-l+1);
laz[lx]+=addk;
return;
}
push_down(l,r,lx);
ll mid=(l+r)>>1;
if(addl<=mid) add(l,mid,addl,addr,addk,lx*2);
if(mid+1<=addr) add(mid+1,r,addl,addr,addk,lx*2+1);
tree[lx]=tree[lx*2]+tree[lx*2+1];
}
ll query(ll l,ll r,ll ql,ll qr,ll lx){
if(ql<=l&&r<=qr) return tree[lx];
push_down(l,r,lx);
ll mid=(l+r)>>1,cns=0;
if(ql<=mid) cns+=query(l,mid,ql,qr,lx*2);
if(mid+1<=qr) cns+=query(mid+1,r,ql,qr,lx*2+1);
return cns;
}
int main(){
// freopen("CSPrp++.in","r",stdin);
// freopen("CSPrp++.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(int i=1;i<=n;i++){
cin>>_>>x>>y;
if(_==1){
cin>>k;
add(1,n,x,y,k,1);
// for(int j=1;j<=15;j++) cout<<tree[j]<<' ';
// cout<<endl;
}
else{
cout<<query(1,n,x,y,1)<<endl;
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
WA,0pts