传送门
对于这种广义线段树的题,想要定位区间 [ l , r ] [l,r] [l,r]可以转化成定位节点 [ l − 1 , l − 1 ] , [ r + 1 , r + 1 ] [l-1,l-1],[r+1,r+1] [l−1,l−1],[r+1,r+1]路径上的一些儿子节点。
设 l c a = t lca=t lca=t
那么路径 [ l − 1 , l − 1 ] → t [l-1,l-1]\rightarrow t [l−1,l−1]→t的右儿子和路径 [ r + 1 , r + 1 ] → t [r+1,r+1]\rightarrow t [r+1,r+1]→t的左儿子就是被定位到的区间。
于是就可以树上差分了。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1