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*( 2*KAPPA+1)/(KAPPA-1) + n* 2*(KAPPA-1) + q)
14- // ! @space O(n*( 2*KAPPA+1)/(KAPPA-1) + n* 2*(KAPPA-1))
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) ))
1515template <int KAPPA = 3 > struct linear_kth_par {
1616 int n;
1717 vi d, leaf, pos, jmp;
@@ -26,24 +26,21 @@ template<int KAPPA = 3> struct linear_kth_par {
2626 t++;
2727 };
2828 auto dfs = [&](auto && self, int v, int p) -> void {
29- st[d[v]] = leaf[v] = v;
29+ st[d[v]] = v;
30+ int & l = leaf[v] = v;
3031 pos[v] = t;
3132 calc (d[v]);
3233 for (int u : adj[v])
3334 if (u != p) {
3435 d[u] = 1 + d[v];
3536 self (self, u, v);
36- if (d[leaf[v]] < d[leaf[u]]) leaf[v] = leaf[u];
37+ if (d[l] < d[leaf[u]]) l = leaf[u];
3738 calc (d[v]);
3839 }
39- // TODO golf this further
40- int len = (d[leaf[v]] - d[v]) * (2 * KAPPA + 1 ) /
41- (KAPPA - 1 );
42- len = max (len, 2 * (KAPPA - 1 ));
43- int i = d[leaf[v]] - sz (lad[leaf[v]]);
44- while (i && sz (lad[leaf[v]]) < len)
45- lad[leaf[v]].push_back (st[i--]);
46- assert (lad[leaf[v]].back () > 0 );
40+ int s =
41+ (d[l] - d[v]) * (2 * KAPPA + 1 ) / (KAPPA - 1 );
42+ s = min (max (s, 2 * (KAPPA - 1 )), d[l] + 1 );
43+ rep (i, sz (lad[l]), s) lad[l].push_back (st[d[l] - i]);
4744 };
4845 dfs (dfs, 0 , 0 );
4946 }
0 commit comments