1010// ! kp.kth_par(v, k); // k edges up from v
1111// ! kp.kth_par(v, 1); // v's parent
1212// ! @endcode
13- // ! @time O(n*max((2*KAPPA+1)/( KAPPA-1) ,2*( KAPPA-1) ) + q)
14- // ! @space O(n*max((2*KAPPA+1)/( KAPPA-1) ,2*( KAPPA-1) ))
15- template <int KAPPA = 3 > struct linear_kth_par {
13+ // ! @time O(n*max((2*KAPPA+3)/ KAPPA,2*KAPPA) + q)
14+ // ! @space O(n*max((2*KAPPA+3)/ KAPPA,2*KAPPA))
15+ template <int KAPPA = 2 > struct linear_kth_par {
1616 int n;
1717 vi d, leaf, pos, jmp;
1818 vector<vi> lad;
1919 linear_kth_par (const auto & adj):
2020 n (sz(adj)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) {
21- static_assert (KAPPA >= 2 );
21+ static_assert (KAPPA >= 1 );
2222 int t = 1 ;
2323 vi st (n);
2424 auto calc = [&](int siz) {
25- jmp[t] = st[max (0 , siz - ( KAPPA - 1 ) * (t & -t))];
25+ jmp[t] = st[max (0 , siz - KAPPA * (t & -t))];
2626 t++;
2727 };
2828 auto dfs = [&](auto && self, int v, int p) -> void {
@@ -37,17 +37,16 @@ template<int KAPPA = 3> struct linear_kth_par {
3737 if (d[l] < d[leaf[u]]) l = leaf[u];
3838 calc (d[v]);
3939 }
40- int s =
41- (d[l] - d[v]) * (2 * KAPPA + 1 ) / (KAPPA - 1 );
42- s = min (max (s, 2 * (KAPPA - 1 )), d[l] + 1 );
40+ int s = (d[l] - d[v]) * (2 * KAPPA + 3 ) / KAPPA;
41+ s = min (max (s, 2 * KAPPA), d[l] + 1 );
4342 rep (i, sz (lad[l]), s) lad[l].push_back (st[d[l] - i]);
4443 };
4544 dfs (dfs, 0 , 0 );
4645 }
4746 int kth_par (int v, int k) {
4847 assert (0 <= k && k <= d[v]);
4948 int j = v;
50- if (unsigned b = k / KAPPA; b)
49+ if (unsigned b = k / ( KAPPA + 1 ) ; b)
5150 b = bit_floor (b), j = jmp[(pos[v] & -b) | b];
5251 return j = leaf[j], lad[j][k + d[j] - d[v]];
5352 }
0 commit comments