#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
ll t[maxn<<2];
ll a[maxn];
int lazy[maxn<<2];
int n,m;
void pushup(int k)
{
t[k]=t[k<<1]+t[k<<1|1];
}
void pushdown(int k,int ln,int rn)
{
if(lazy[k])
{
lazy[k<<1]+=lazy[k];
lazy[k<<1|1]+=lazy[k];
t[k<<1]+=lazy[k]*ln;
t[k<<1|1]+=lazy[k]*rn;
lazy[k]=0;
}
}
void build(int l,int r,int k)
{
if(l==r){
t[k]=a[l];
}else{
int m = l+((r-l)>>1);
build(l,m,k<<1);
build(m+1,r,k<<1|1);
pushup(k);
}
}
void update(int L,int R,int v,int l,int r,int k)
{
if(L<=l&&r<=R){
lazy[k]+=v;
t[k]+=(r-l+1)*v;
}else{
int m=l+((r-l)>>1);
pushdown(k,m-l+1,r-m);
if(L<=m)
update(L,R,v,l,m,k<<1);
if(R>m)
update(L,R,v,m+1,r,k<<1|1);
pushup(k);
}
}
ll query(int L,int R,int l,int r,int k)
{
if(L<=l&&r<=R){
return t[k];
}else{
ll res=0;
int m = l+((r-l)>>1);
pushdown(k,m-l+1,r-m);
if(L<=m)
res+=query(L,R,l,m,k<<1);
if(R>m)
res+=query(L,R,m+1,r,k<<1|1);
return res;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,n,1);
while(m--)
{
int index,x,y,k;
scanf("%d",&index);
if(index==1)
{
scanf("%d%d%d",&x,&y,&k);
update(x,y,k,1,n,1);
}
else{
scanf("%d%d",&x,&y);
ll ans = query(x,y,1,n,1);
cout << ans << endl;
}
}
return 0;
}
05-21
494
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)