就是一题模板
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[140000],k,x,y,n,r,m,h,g, sumv[300000],addv[300010],s;
void weihu(int o,int l,int r){
int lc=(o<<1),rc=(o<<1)+1;
if(l<r)
sumv[o]=(ll)(sumv[lc]+sumv[rc]);
if(l==r)
sumv[o]+=k;
else
sumv[o]+=(ll)addv[o]*(r-l+1);
}
/*void bt(int l,int r,int o)
{
addv[o]=0;
if(l==r)
{
scanf("%lld",&sumv[o]);
return;
}
int mid=(l+r)>>1,lc=o<<1,rc=o<<1|1;
bt(l,mid,lc); bt(mid+1,r,rc);
weihu(o,l,r);
}*/
void up(int o,int l,int r){
int lc=(o<<1),rc=(o<<1)+1;
if(x<=l&&r<=y)
addv[o]+=k;
else{
int m=l+(r-l)/2;
if(x<=m)up(lc,l,m);
if(y>m)up(rc,m+1,r);
}
weihu(o,l,r);
}
void query(int o,int l,int r,int add){
int lc=(o<<1),rc=(o<<1)+1;
if(x<=l&&r<=y)
s+=(ll)(sumv[o]+(ll)add*(r-l+1));
else{
int m=l+(r-l)/2;
if(x<=m) query(lc,l,m,add+addv[o]);
if(y>m) query(rc,m+1,r,add+addv[o]);
}
}
int main()
{
scanf("%lld%lld",&n,&m);
//bt(1,n,1);//正常建树。。
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);//递
h=log(n)/log(2)+0.9999; //推
g=(1<<(h+1))-1; //建
for(int i=(1<<h);i<=g;++i) //树
sumv[i]=a[i-(1<<h)+1]; //啊
for(int i=(1<<h)-1;i>=1;i--) //啊
sumv[i]=(ll)(sumv[i<<1]+sumv[i<<1|1]);//啊
for(int i=1;i<=m;++i){
scanf("%lld",&r);
if(r==1){
scanf("%lld%lld%lld",&x,&y,&k);
up(1,1,(1<<h));
}
if(r==2){
s=0;
scanf("%lld%lld",&x,&y);
query(1,1,(1<<h),0);
printf("%lld\n",s);
}
}
return 0;
}