note
标记永久化
void pushdown(int l,int r,int o) {
if (add[o]) {
int m=((l+r)>>1);
add[o*2]+=add[o];
sum[o*2]+=add[o]*(m-l+1);
add[o*2+1]+=add[o];
sum[o*2+1]+=add[o]*(r-m);
add[o]=0;
}
}
int update3(int l,int r,int o) {
if (l>=L&&r<=R) {
add[o]+=v;
sum[o]+=(r-l+1)*v;
}
else {
pushdown(l,r,o);
int m=((l+r)>>1);
if (m>=L) update3(l,m,o*2);
if (m<R) update3(m+1,r,o*2+1);
sum[o]=sum[o*2]+sum[o*2+1];
}
}
int query3(int l,int r,int o) {
if (l>=L&&r<=R) return sum[o];
else {
pushdown(l,r,o);
int m=((l+r)>>1);
if (m>=R) return query3(l,m,o*2);
if (m<L) return query3(m+1,r,o*2+1);
return query3(l,m,o*2)+query3(m+1,r,o*2+1);
}
}
懒惰标记
void update2(int l,int r,int o) {
if (l>=L&&r<=R) {
add[o]+=v;
sum[o]+=(r-l+1)*v;
}
else {
int m=((l+r)>>1);
if (m>=L) update2(l,m,o*2);
if (m<R) update2(m+1,r,o*2+1);
sum[o]=sum[o*2]+sum[o*2+1]+add[o]*(r-l+1);
}
}
int query2(int l,int r,int o) {
if (l>=L&&r<=R) return sum[o];
else {
int m=((l+r)>>1);
int v=(min(R,r)-max(L,l)+1)*add[o];
if (m>=R) return query2(l,m,o*2)+v;
if (m<L) return query2(m+1,r,o*2+1)+v;
return query2(l,m,o*2)+query2(m+1,r,o*2+1)+v;
}
}