代码
#include<bits/stdc++.h>
#define lc p*2
#define rc p*2+1
using namespace std;
long long n,m,w[400012];
struct node{
long long l,r,ans,add;
}node[400012];
void build(long long p,long long l,long long r){
node[p].l=l;node[p].r=r;
if(l==r){
node[p].ans=w[l];
return;
}
long long mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
node[p].ans=node[lc].ans+node[rc].ans;
}
void pushdown(long long p){
if(node[p].add){
node[lc].ans+=node[p].add*(node[lc].r-node[lc].l+1);
node[rc].ans+=node[p].add*(node[rc].r-node[rc].l+1);
node[lc].add+=node[p].add;
node[rc].add+=node[p].add;
node[p].add=0;
}
}
int que(long long p,long long x,long long y){
if(x<=node[p].l&&node[p].r<=y){
return node[p].ans;
}
pushdown(p);
long long mid=node[p].l+node[p].r>>1;
long long sum=0;
if(x<=mid)sum+=que(lc,x,y);
if(y>mid)sum+=que(rc,x,y);
return sum;
}
void update(long long p,long long x,long long y,long long k){
if(x<=node[p].l&&node[p].r<=y){
node[p].ans+=(node[p].r-node[p].l+1)*k;
node[p].add+=k;
return;
}
pushdown(p);
long long mid=node[p].l+node[p].r>>1;
if(x<=mid)update(lc,x,y,k);
if(y>mid)update(rc,x,y,k);
node[p].ans=node[lc].ans+node[rc].ans;
}
int main(){
cin>>n>>m;
for(long long i=1;i<=n;i++)cin>>w[i];
build(1,1,n);
for(long long i=1;i<=m;i++){
int pd;
cin>>pd;
if(pd==1){
long long x,y,k;
cin>>x>>y>>k;
update(1,x,y,k);
}
if(pd==2){
long long x,y;
cin>>x>>y;
cout<<que(1,x,y)<<"\n";
}
}
}
最后三个点