Orange1015 @ 2023-02-24 23:59:12
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
int n,m,op;
int a[maxn];
struct node{
int l,r,sum=0,mul=1,lazy=0;
}t[maxn << 2];
void update(int id){
t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
return;
}
void buildtree(int id,int l,int r){
t[id].l=l;
t[id].r=r;
if(l==r){
t[id].sum=a[l];
return;
}
int mid=(l+r)>>1;
buildtree(id<<1,l,mid);
buildtree(id<<1|1,mid+1,r);
update(id);
return;
}
void pushdown(int id){
if(t[id].lazy){
t[id<<1].lazy+=t[id].lazy;
t[id<<1].sum+=(t[id<<1].r-t[id].l+1)*t[id].lazy;
t[id<<1|1].lazy+=t[id].lazy;
t[id<<1|1].sum+=(t[id].r-t[id].l+1)*t[id].lazy;
t[id].lazy=0;
}
return;
}
void change(int id,int l,int r,int val){
if(l<=t[id].l && t[id].r<=r){
t[id].lazy+=val;
t[id].sum+=(t[id].r-t[id].l+1)*val;
return;
}
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
if(l<=mid) change(id<<1,l,r,val);
if(r>mid) change(id<<1|1,l,r,val);
update(id);
return;
}
int query(int id,int l,int r){
if(l<=t[id].l && r>=t[id].r){
return t[id].sum;
}
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
int ans=0;
if(l<=mid) ans+=query(id<<1,l,r);
if(r>mid) ans+=query(id<<1|1,l,r);
return ans;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> a[i];
}
buildtree(1,1,n);
while(m--){
cin >> op;
if(op==1){
int x,y,k;
cin >> x >> y >> k;
change(1,x,y,k);
}
else{
int x,y;
cin >> x >> y;
cout << query(1,x,y) << '\n';
}
}
return 0;
}
by LOVE_Ynoi @ 2023-02-25 06:50:00
pushdown里的第三行和第五行
t[id<<1].sum+=(t[id<<1].r-t[id].l+1)*t[id].lazy;
t[id<<1|1].sum+=(t[id].r-t[id].l+1)*t[id].lazy;
改成这样
t[id<<1].sum+=(t[id<<1].r-t[id<<1].l+1)*t[id].lazy;
t[id<<1|1].sum+=(t[id<<1|1].r-t[id<<1|1].l+1)*t[id].lazy;
by Orange1015 @ 2023-02-25 11:26:46
@wsy20080329 orz