66// ! kp.kth_par(v, k); // k edges up from v
77// ! kp.kth_par(v, 1); // v's parent
88// ! @endcode
9- // ! @time O(n*max((2*KAPPA +3)/KAPPA ,2*KAPPA ) + q)
10- // ! @space O(n*max((2*KAPPA +3)/KAPPA ,2*KAPPA ))
11- template <int KAPPA = 2 > struct linear_kth_par {
9+ // ! @time O(n*max((2*K +3)/K ,2*K ) + q)
10+ // ! @space O(n*max((2*K +3)/K ,2*K ))
11+ template <int K = 2 > struct linear_kth_par {
1212 int n;
1313 vi d, leaf, pos, jmp;
1414 vector<vi> lad;
1515 linear_kth_par (const auto & g):
1616 n (sz(g)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) {
17- static_assert (KAPPA >= 1 );
17+ static_assert (K >= 1 );
1818 int t = 1 ;
1919 vi st (n);
2020 auto calc = [&](int s) {
21- jmp[t] = st[max (0 , s - KAPPA * (t & -t))];
21+ jmp[t] = st[max (0 , s - K * (t & -t))];
2222 t++;
2323 };
2424 auto dfs = [&](auto dfs, int u, int p) -> void {
@@ -32,16 +32,16 @@ template<int KAPPA = 2> struct linear_kth_par {
3232 if (d[l] < d[leaf[v]]) l = leaf[v];
3333 calc (d[u]);
3434 }
35- int s = (d[l] - d[u]) * (2 * KAPPA + 3 ) / KAPPA ;
36- s = min (max (s, 2 * KAPPA ), d[l] + 1 );
35+ int s = (d[l] - d[u]) * (2 * K + 3 ) / K ;
36+ s = min (max (s, 2 * K ), d[l] + 1 );
3737 rep (i, sz (lad[l]), s) lad[l].push_back (st[d[l] - i]);
3838 };
3939 dfs (dfs, 0 , 0 );
4040 }
4141 int kth_par (int u, int k) {
4242 assert (0 <= k && k <= d[u]);
4343 int anc_d = d[u] - k;
44- if (int j = bit_floor (k / (KAPPA + 1u )))
44+ if (int j = bit_floor (k / (K + 1u )))
4545 u = jmp[(pos[u] & -j) | j];
4646 return u = leaf[u], lad[u][d[u] - anc_d];
4747 }
0 commit comments