@@ -19,12 +19,14 @@ struct linear_kth_par {
1919 };
2020 vector<node> t;
2121 vector<pii> j;
22- linear_kth_par (const auto & adj) : t(sz(adj)), j(2 * sz (t)) {
22+ linear_kth_par (const auto & adj):
23+ t (sz(adj)), j(2 * sz (t)) {
2324 vi st;
2425 int pos = 1 ;
2526 auto add_j = [&]() -> void {
26- j[pos] = {st[max<int >(0 , sz (st) - 1 - 2 * (pos & -pos))],
27- st[max<int >(0 , sz (st) - 1 - 4 * (pos & -pos))]};
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))]};
2830 pos++;
2931 };
3032 auto dfs = [&](auto && self, int v) -> void {
@@ -35,7 +37,8 @@ struct linear_kth_par {
3537 if (u != t[v].p ) {
3638 t[u].d = t[t[u].p = v].d + 1 ;
3739 self (self, u);
38- if (t[t[u].dl ].d > t[t[v].dl ].d ) t[v].dl = t[u].dl ;
40+ if (t[t[u].dl ].d > t[t[v].dl ].d )
41+ t[v].dl = t[u].dl ;
3942 add_j ();
4043 }
4144 st.pop_back ();
@@ -52,17 +55,14 @@ struct linear_kth_par {
5255 int kth_par (int v, int k) {
5356 assert (0 <= k && k <= t[v].d );
5457 switch (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 ];
58+ case 0 : return v;
59+ case 1 : return t[v].p ;
60+ case 2 : 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 ];
6666 }
6767 }
6868};
0 commit comments