1. 程式人生 > >BZOJ-3626:LCA(離線+樹鏈剖分)

BZOJ-3626:LCA(離線+樹鏈剖分)

dep bzoj inpu 轉化 輸出 深度 定義 區間 三元組

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

Sample Output

8
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到根的權值,用樹剖即可。

BZOJ-3626:LCA(離線+樹鏈剖分)