99// ! @space O(n)
1010struct linear_kth_par {
1111 struct node {
12- int d, p = -1 , idx, dl;
13- vi lad;
12+ int d, p = -1 , idx, dl, tin;
1413 };
1514 vector<node> t;
1615 vector<pii> j;
17- linear_kth_par (const vector<vi>& adj):
18- t (sz(adj)), j(2 * sz (t)) {
16+ vi lad;
17+ vi head;
18+ linear_kth_par (const vector<vi>& adj) : t(sz(adj)), j(2 * sz (t)), head(sz(adj)) {
1919 vi st;
2020 int pos = 1 ;
2121 auto add_j = [&]() -> void {
2222 j[pos] = {st[max (0 , sz (st) - 1 - 2 * (pos & -pos))],
23- st[max (0 , sz (st) - 1 - 4 * (pos & -pos))]};
23+ st[max (0 , sz (st) - 1 - 4 * (pos & -pos))]};
2424 pos++;
2525 };
2626 auto dfs = [&](auto && self, int v) -> void {
@@ -40,26 +40,28 @@ struct linear_kth_par {
4040 rep (i, 0 , sz (t)) {
4141 if (t[i].p == -1 ) dfs (dfs, i);
4242 if (t[i].p == -1 || t[t[i].p ].dl != t[i].dl ) {
43- int leaf = t[i].dl ;
44- vi& lad = t[leaf].lad ;
45- lad.resize (
46- min ((t[leaf].d - t[i].d ) * 2 , t[leaf].d + 1 ),
47- leaf);
48- rep (k, 1 , sz (lad)) lad[k] = t[lad[k - 1 ]].p ;
43+ head[t[i].dl ] = i;
44+ for (int u = i, v = t[i].dl ; u != -1 && v != i; u = t[u].p , v = t[v].p )
45+ t[v].tin = sz (lad), lad.push_back (u);
4946 }
5047 }
5148 }
5249 int kth_par (int v, int k) {
5350 assert (0 <= k && k <= t[v].d );
5451 switch (k) {
55- case 0 : return v;
56- case 1 : return t[v].p ;
57- case 2 : return t[t[v].p ].p ;
58- default :
59- int i = 1 << __lg (k / 3 );
60- auto [j1, j2] = j[(t[v].idx & -i) | i];
61- int leaf = t[t[v].d - t[j2].d <= k ? j2 : j1].dl ;
62- return t[leaf].lad [k + t[leaf].d - t[v].d ];
52+ case 0 : return v;
53+ case 1 : return t[v].p ;
54+ case 2 : return t[t[v].p ].p ;
55+ default :
56+ int i = 1 << __lg (k / 3 );
57+ auto [j1, j2] = j[(t[v].idx & -i) | i];
58+ int up = t[v].d - t[j2].d <= k ? j2 : j1;
59+ int leaf = t[up].dl ;
60+ assert (t[head[leaf]].d >= t[v].d - k);
61+ int res = lad[t[leaf].tin + t[head[leaf]].d - (t[v].d - k)];
62+ // cerr << "hi: " << t[res].d << ' ' << t[v].d - k << endl;
63+ return res;
64+ // return t[leaf].lad[k + t[leaf].d - t[v].d];
6365 }
6466 }
6567};
0 commit comments