1111struct ladder {
1212 int n;
1313 vector<vi> b_tbl;
14- vi d, p, dl, idx_l , l_tbl;
14+ vi d, p, dl, le, ri , l_tbl;
1515 // ! @param adj forest (rooted or unrooted)
1616 // ! @time O(n log n)
1717 // ! @space O(n log n) for b_tbl. Everything else is O(n)
18- ladder (const vector<vi>& adj):
19- n (sz(adj)), d(n), p(n, -1 ), dl(n), idx_l(n) {
18+ ladder (const vector<vi>& adj) : n(sz(adj)), d(n), p(n, -1 ), dl(n), le(n), ri(n) {
2019 auto dfs = [&](auto && self, int v) -> void {
2120 dl[v] = v;
2221 for (int u : adj[v])
@@ -30,9 +29,10 @@ struct ladder {
3029 if (p[i] == -1 ) p[i] = i, dfs (dfs, i);
3130 if (p[i] == i || dl[p[i]] != dl[i]) {
3231 int v = dl[i], len = (d[v] - d[i]) * 2 ;
33- idx_l [v] = sz (l_tbl) + d[v] ;
32+ le [v] = sz (l_tbl);
3433 for (; v != -1 && len--; v = p[v])
3534 l_tbl.push_back (v);
35+ ri[v] = sz (l_tbl);
3636 }
3737 }
3838 b_tbl = treeJump (p);
@@ -49,6 +49,9 @@ struct ladder {
4949 int bit = __lg (k);
5050 v = b_tbl[bit][v], k -= (1 << bit);
5151 int leaf = dl[v];
52- return l_tbl[idx_l[leaf] + k - d[v]];
52+ int idx = le[leaf] + k + d[leaf] - d[v];
53+ assert (le[leaf] <= idx);
54+ assert (idx < ri[leaf]);
55+ return l_tbl[le[leaf] + k + d[leaf] - d[v]];
5356 }
5457};
0 commit comments