板子70pts
#include<bits/stdc++.h>
#define ll long long
#define MAXN 100001
using namespace std;
int n,m;
int a[MAXN],ans[MAXN<<2],lazy[MAXN<<2];
inline ll ls(ll x){
return x<<1;
}
inline ll rs(ll x){
return x<<1|1;
}
inline void push_up(ll p){
ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r){
if(l==r){
ans[p]=a[l];
return ;
}
ll mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
inline void f(ll p,ll l,ll r,ll k){
lazy[p]=lazy[p]+k;
ans[p]=ans[p]+(k*(r-l+1));
}
inline void push_down(ll p,ll l,ll r){
ll mid=(l+r)>>1;
f(ls(p),l,mid,lazy[p]);
f(rs(p),mid+1,r,lazy[p]);
lazy[p]=0;
}
inline void updata(ll nl,ll nr,ll l,ll r,ll p,ll k){
if(nl<=l&&nr>=r){
ans[p]=ans[p]+(k*(r-l+1));
lazy[p]=lazy[p]+k;
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(nl<=mid){
updata(nl,nr,l,mid,ls(p),k);
}
if(nr>mid){
updata(nl,nr,mid+1,r,rs(p),k);
}
push_up(p);
}
ll query(ll qx,ll qy,ll l,ll r,ll p){
ll res=0;
if(qx<=l&&r<=qy){
return ans[p];
}
ll mid=(l+r)>>1;
push_down(p,l,r);
if(qx<=mid){
res+=query(qx,qy,l,mid,ls(p));
}
if(qy>mid){
res+=query(qx,qy,mid+1,r,rs(p));
}
return res;
}
int main(){
ll a1,b,c,d,e,f;
cin>>n>>m;
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
scanf("%lld",&a1);
if(a1==1){
scanf("%lld%lld%lld",&b,&c,&d);
updata(b,c,1,n,1,d);
}
if(a1==2){
scanf("%lld%lld",&e,&f);
printf("%lld\n",query(e,f,1,n,1));
}
}
return 0;
}