Skip to content

Commit c8b7231

Browse files
committed
better constant
1 parent 1b89bbc commit c8b7231

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

library/trees/ladder_decomposition/linear_kth_par.hpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@
55
//! int kth_par = kp.kth_par(v, k);
66
//! @endcode
77
//! kth_par = a node k edges up from v
8-
//! @time O(3.5*n + q)
9-
//! @space O(3.5*n)
8+
//! @time O(n + q)
9+
//! @space O(n)
1010
struct linear_kth_par {
1111
struct node {
1212
int d, p = -1, idx, dl;
1313
vi lad;
1414
};
1515
vector<node> t;
16-
vi j;
16+
vector<pii> j;
1717
linear_kth_par(const vector<vi>& adj):
1818
t(sz(adj)), j(2 * sz(t)) {
1919
vi st;
2020
int pos = 1;
2121
auto add_j = [&]() -> void {
22-
j[pos] = st[max(0, sz(st) - 1 - 2 * (pos & -pos))];
22+
j[pos] = {st[max(0, sz(st) - 1 - 2 * (pos & -pos))],
23+
st[max(0, sz(st) - 1 - 4 * (pos & -pos))]};
2324
pos++;
2425
};
2526
auto dfs = [&](auto&& self, int v) -> void {
@@ -37,26 +38,27 @@ struct linear_kth_par {
3738
}
3839
st.pop_back();
3940
};
40-
rep(i, 0, sz(t)) if (t[i].p == -1) t[i].p = i,
41-
dfs(dfs, i);
41+
rep(i, 0, sz(t)) if (t[i].p == -1) dfs(dfs, i);
4242
rep(i, 0, sz(t)) if (
43-
t[i].p == i || t[t[i].p].dl != t[i].dl) {
43+
t[i].p == -1 || t[t[i].p].dl != t[i].dl) {
4444
int leaf = t[i].dl;
4545
vi& lad = t[leaf].lad;
4646
lad.resize(
47-
min((t[leaf].d - t[i].d) * 7 / 2, t[leaf].d + 1),
47+
min((t[leaf].d - t[i].d) * 2, t[leaf].d + 1),
4848
leaf);
4949
rep(k, 1, sz(lad)) lad[k] = t[lad[k - 1]].p;
5050
}
5151
}
5252
int kth_par(int v, int k) {
53+
assert(0 <= k && k <= t[v].d);
5354
switch (k) {
5455
case 0: return v;
5556
case 1: return t[v].p;
5657
case 2: return t[t[v].p].p;
5758
default:
58-
int i = 1 << __lg(k / 3),
59-
leaf = t[j[(t[v].idx & -i) | i]].dl;
59+
int i = 1 << __lg(k / 3);
60+
auto [j1, j2] = j[(t[v].idx & -i) | i];
61+
int leaf = t[t[v].d - t[j2].d <= k ? j2 : j1].dl;
6062
return t[leaf].lad[k + t[leaf].d - t[v].d];
6163
}
6264
}

0 commit comments

Comments
 (0)