标签:pre font += class date update query res 区间
以 区间和 为例。
ll ls(ll p) {return p<<1;}
ll rs(ll p) {return p<<1|1;}
void push_up(ll p) {
ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r) {
tag[p]=0;
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);
}
void f(ll p,ll l,ll r,ll k) {
tag[p]=tag[p]+k;
ans[p]=ans[p]+k*(r-l+1);
}
void push_down(ll p,ll l,ll r) {
ll Mid=(l+r)>>1;
f(ls(p),l,Mid,tag[p]);
f(rs(p),Mid+1,r,tag[p]);
tag[p]=0;
}
void update(ll nl,ll nr,ll p,ll l,ll r,ll k) {
if(nl<=l&&r<=nr) {
tag[p]+=k;
ans[p]+=k*(r-l+1);
return ;
}
push_down(p,l,r);
ll Mid=(l+r)>>1;
if(nl<=Mid) update(nl,nr,ls(p),l,Mid,k);
if(nr>Mid) update(nl,nr,rs(p),Mid+1,r,k);
push_up(p);
}
ll query(ll ql,ll qr,ll p,ll l,ll r) {
ll res=0;
if(ql<=l&&r<=qr) return ans[p];
ll Mid=(l+r)>>1;
push_down(p,l,r);
if(ql<=Mid) res+=query(ql,qr,ls(p),l,Mid);
if(qr>Mid) res+=query(ql,qr,rs(p),Mid+1,r);
return res;
}
标签:pre font += class date update query res 区间
原文地址:https://www.cnblogs.com/qq8260573/p/10426175.html