BZOJ-3626:LCA(离线+树链剖分)
Description
给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。
设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。
有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)]。
(即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和)
Input
第一行2个整数n q。
接下来n-1行,分别表示点1到点n-1的父节点编号。
接下来q行,每行3个整数l r z。
Output
输出q行,每行表示一个询问的答案。每个答案对201314取模输出
Sample Input
5 2
0
0
1
1
1 4 3
1 4 2
0
0
1
1
1 4 3
1 4 2
Sample Output
8
5
5
HINT
共5组数据,n与q的规模分别为10000,20000,30000,40000,50000。
思路:发现很难做,转化为差分。每个询问[x,y]与z的LCA和拆分两个三元组(x-1,z,-1)和(y,z,1);我们从1到N加点,每加一个点,就把它到根的值++,然后回答对应的三元组,累加到三元组对应的答案里去。比如加点到[1,i],如果有三元组(i,x,1),那么就用累加x到根的权值,用树剖即可。
It is your time to fight!