1414// ! @space O(n)
1515struct linear_kth_par {
1616 struct node {
17- int d, p = -1 , dl, idx_j, idx_l;
17+ int d, p = -1 , dl, idx_j;
18+ basic_string<int > lad;
1819 };
1920 vector<node> t;
2021 vector<pii> j;
21- vi l;
22- linear_kth_par (const auto & adj):
23- t (sz(adj)), j(2 * sz (t)) {
22+ linear_kth_par (const auto & adj) : t(sz(adj)), j(2 * sz (t)) {
2423 vi st;
2524 int pos = 1 ;
2625 auto add_j = [&]() -> void {
27- j[pos] = {
28- st[max<int >(0 , sz (st) - 1 - 2 * (pos & -pos))],
29- st[max<int >(0 , sz (st) - 1 - 4 * (pos & -pos))]};
26+ j[pos] = {st[max<int >(0 , sz (st) - 1 - 2 * (pos & -pos))],
27+ st[max<int >(0 , sz (st) - 1 - 4 * (pos & -pos))]};
3028 pos++;
3129 };
3230 auto dfs = [&](auto && self, int v) -> void {
@@ -37,8 +35,7 @@ struct linear_kth_par {
3735 if (u != t[v].p ) {
3836 t[u].d = t[t[u].p = v].d + 1 ;
3937 self (self, u);
40- if (t[t[u].dl ].d > t[t[v].dl ].d )
41- t[v].dl = t[u].dl ;
38+ if (t[t[u].dl ].d > t[t[v].dl ].d ) t[v].dl = t[u].dl ;
4239 add_j ();
4340 }
4441 st.pop_back ();
@@ -47,23 +44,25 @@ struct linear_kth_par {
4744 if (t[i].p == -1 ) dfs (dfs, i);
4845 if (t[i].p == -1 || t[t[i].p ].dl != t[i].dl ) {
4946 int v = t[i].dl , len = (t[v].d - t[i].d ) * 2 ;
50- t[v].idx_l = sz (l) + t[v].d ;
51- for (; v != -1 && len--; v = t[v].p )
52- l.push_back (v);
47+ auto & lad = t[v].lad ;
48+ for (; v != -1 && len--; v = t[v].p ) lad += v;
5349 }
5450 }
5551 }
5652 int kth_par (int v, int k) {
5753 assert (0 <= k && k <= t[v].d );
5854 switch (k) {
59- case 0 : return v;
60- case 1 : return t[v].p ;
61- case 2 : return t[t[v].p ].p ;
62- default :
63- int i = bit_floor (unsigned (k / 3 ));
64- auto [j1, j2] = j[(t[v].idx_j & -i) | i];
65- int up = t[v].d - t[j2].d <= k ? j2 : j1;
66- return l[t[t[up].dl ].idx_l - t[v].d + k];
55+ case 0 :
56+ return v;
57+ case 1 :
58+ return t[v].p ;
59+ case 2 :
60+ return t[t[v].p ].p ;
61+ default :
62+ int i = bit_floor (unsigned (k / 3 ));
63+ auto [j1, j2] = j[(t[v].idx_j & -i) | i];
64+ int leaf = t[t[v].d - t[j2].d <= k ? j2 : j1].dl ;
65+ return t[leaf].lad [k + t[leaf].d - t[v].d ];
6766 }
6867 }
6968};
0 commit comments