55// ! int kth_par = kp.kth_par(v, k);
66// ! @endcode
77// ! kth_par = a node k edges up from v
8- // ! @time O(3.5* n + q)
9- // ! @space O(3.5* n)
8+ // ! @time O(n + q)
9+ // ! @space O(n)
1010struct linear_kth_par {
1111 struct node {
1212 int d, p = -1 , idx, dl;
1313 vi lad;
1414 };
1515 vector<node> t;
16- vi j;
16+ vector<pii> j;
1717 linear_kth_par (const vector<vi>& adj):
1818 t (sz(adj)), j(2 * sz (t)) {
1919 vi st;
2020 int pos = 1 ;
2121 auto add_j = [&]() -> void {
22- j[pos] = st[max (0 , sz (st) - 1 - 2 * (pos & -pos))];
22+ j[pos] = {st[max (0 , sz (st) - 1 - 2 * (pos & -pos))],
23+ st[max (0 , sz (st) - 1 - 4 * (pos & -pos))]};
2324 pos++;
2425 };
2526 auto dfs = [&](auto && self, int v) -> void {
@@ -37,26 +38,27 @@ struct linear_kth_par {
3738 }
3839 st.pop_back ();
3940 };
40- rep (i, 0 , sz (t)) if (t[i].p == -1 ) t[i].p = i,
41- dfs (dfs, i);
41+ rep (i, 0 , sz (t)) if (t[i].p == -1 ) dfs (dfs, i);
4242 rep (i, 0 , sz (t)) if (
43- t[i].p == i || t[t[i].p ].dl != t[i].dl ) {
43+ t[i].p == - 1 || t[t[i].p ].dl != t[i].dl ) {
4444 int leaf = t[i].dl ;
4545 vi& lad = t[leaf].lad ;
4646 lad.resize (
47- min ((t[leaf].d - t[i].d ) * 7 / 2 , t[leaf].d + 1 ),
47+ min ((t[leaf].d - t[i].d ) * 2 , t[leaf].d + 1 ),
4848 leaf);
4949 rep (k, 1 , sz (lad)) lad[k] = t[lad[k - 1 ]].p ;
5050 }
5151 }
5252 int kth_par (int v, int k) {
53+ assert (0 <= k && k <= t[v].d );
5354 switch (k) {
5455 case 0 : return v;
5556 case 1 : return t[v].p ;
5657 case 2 : return t[t[v].p ].p ;
5758 default :
58- int i = 1 << __lg (k / 3 ),
59- leaf = t[j[(t[v].idx & -i) | i]].dl ;
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 ;
6062 return t[leaf].lad [k + t[leaf].d - t[v].d ];
6163 }
6264 }
0 commit comments