|
14 | 14 | //! @endcode |
15 | 15 | struct ladder { |
16 | 16 | int n; |
17 | | - vi d, p, idx, l; |
| 17 | + vi d, p, idx, lad; |
18 | 18 | vector<vi> jmp; |
19 | 19 | ladder(const auto& g): |
20 | | - n(sz(g)), d(n), p(n), idx(n), l(2 * n) { |
| 20 | + n(sz(g)), d(n), p(n), idx(n), lad(2 * n) { |
21 | 21 | int i = 0; |
22 | | - vi s(n); |
23 | 22 | auto dfs = [&](auto dfs, int u) -> vi { |
24 | 23 | vi path; |
25 | | - s[d[u]] = u; |
26 | 24 | for (int v : g[u]) |
27 | 25 | if (v != p[u]) { |
28 | 26 | d[v] = d[p[v] = u] + 1; |
29 | 27 | vi x = dfs(dfs, v); |
30 | 28 | if (sz(x) > sz(path)) swap(x, path); |
31 | 29 | for (int y : x) idx[y] = i; |
32 | | - for (int y : x) l[i++] = y; |
33 | | - rep(j, 0, min(sz(x), d[v])) l[i++] = s[d[u] - j]; |
| 30 | + for (int y : x) lad[i++] = y; |
| 31 | + rep(j, 0, min<int>(sz(x), d[v])) lad[i] = |
| 32 | + p[lad[i - 1]], i++; |
34 | 33 | } |
35 | 34 | path.push_back(u); |
36 | 35 | return path; |
37 | 36 | }; |
38 | 37 | vi x = dfs(dfs, 0); |
39 | 38 | for (int y : x) idx[y] = i; |
40 | | - for (int y : x) l[i++] = y; |
| 39 | + for (int y : x) lad[i++] = y; |
41 | 40 | jmp = treeJump(p); |
42 | 41 | } |
43 | 42 | int kth_par(int u, int k) { |
44 | 43 | assert(0 <= k && k <= d[u]); |
45 | 44 | if (k == 0) return u; |
46 | 45 | int bit = __lg(k); |
47 | 46 | u = jmp[bit][u], k -= (1 << bit); |
48 | | - int i = idx[u], j = i + d[l[i]] - d[u]; |
49 | | - assert(l[j] == u); |
50 | | - // subarray [j, j+k] of l corresponds to the rest |
| 47 | + int i = idx[u], j = i + d[lad[i]] - d[u]; |
| 48 | + assert(lad[j] == u); |
| 49 | + // subarray [j, j+k] of lad corresponds to the rest |
51 | 50 | // of the jump |
52 | | - return l[j + k]; |
| 51 | + return lad[j + k]; |
53 | 52 | } |
54 | 53 | }; |
0 commit comments