1111// ! @space O(n)
1212struct linear_kth_par {
1313 int n;
14- vi d, et_i, et_d , idx, lad;
14+ vi d, d_tour, tin , idx, lad;
1515 vector<basic_string<int >> jmp;
1616 linear_kth_par (const auto & g):
17- n (sz(g)), d(n), et_i( n), et_d( 2 * n), idx(n),
17+ n (sz(g)), d(n), d_tour( 2 * n), tin( n), idx(n),
1818 lad (2 * n), jmp(2 * n) {
19- int i = 0 , j = 1 ;
19+ int i = 0 , t = 1 ;
2020 vi st (n);
2121 auto calc = [&](int u) {
22- et_d[et_i[u] = j] = d[u];
23- for (int k = 1 ; k <= min (j & -j, d[u]); k *= 2 )
24- jmp[j] += st[d[u] - k];
25- j++;
22+ for (int k = 1 ; k <= min (t & -t, d[u]); k *= 2 )
23+ jmp[t] += st[d[u] - k];
24+ d_tour[t++] = d[u];
2625 };
2726 auto dfs = [&](auto dfs, int u, int p) -> vi {
2827 vi path;
29- st[d[u]] = u;
28+ tin[ st[d[u]] = u] = t ;
3029 calc (u);
3130 for (int v : g[u])
3231 if (v != p) {
@@ -50,8 +49,8 @@ struct linear_kth_par {
5049 assert (0 <= k && k <= d[u]);
5150 if (k == 0 ) return u;
5251 int anc_d = d[u] - k, bc = bit_ceil (k + 0u );
53- int j = (et_i [u] + bc / 2 ) & -bc;
54- int i = idx[jmp[j ].at (__lg (et_d[j ] - anc_d))];
52+ int t = (tin [u] + bc / 2 ) & -bc;
53+ int i = idx[jmp[t ].at (__lg (d_tour[t ] - anc_d))];
5554 return lad[i + d[lad[i]] - anc_d];
5655 }
5756};
0 commit comments