Skip to content

Commit bbb2a2e

Browse files
committed
switch back ladder decomp
1 parent 99eac09 commit bbb2a2e

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

library/trees/ladder_decomposition/linear_kth_par.hpp

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,17 @@
1414
//! @space O(n)
1515
struct linear_kth_par {
1616
struct node {
17-
int d, p = -1, dl, idx_j, idx_l;
17+
int d, p = -1, dl, idx_j;
18+
basic_string<int> lad;
1819
};
1920
vector<node> t;
2021
vector<pii> j;
21-
vi l;
22-
linear_kth_par(const auto& adj):
23-
t(sz(adj)), j(2 * sz(t)) {
22+
linear_kth_par(const auto& adj) : t(sz(adj)), j(2 * sz(t)) {
2423
vi st;
2524
int pos = 1;
2625
auto add_j = [&]() -> void {
27-
j[pos] = {
28-
st[max<int>(0, sz(st) - 1 - 2 * (pos & -pos))],
29-
st[max<int>(0, sz(st) - 1 - 4 * (pos & -pos))]};
26+
j[pos] = {st[max<int>(0, sz(st) - 1 - 2 * (pos & -pos))],
27+
st[max<int>(0, sz(st) - 1 - 4 * (pos & -pos))]};
3028
pos++;
3129
};
3230
auto dfs = [&](auto&& self, int v) -> void {
@@ -37,8 +35,7 @@ struct linear_kth_par {
3735
if (u != t[v].p) {
3836
t[u].d = t[t[u].p = v].d + 1;
3937
self(self, u);
40-
if (t[t[u].dl].d > t[t[v].dl].d)
41-
t[v].dl = t[u].dl;
38+
if (t[t[u].dl].d > t[t[v].dl].d) t[v].dl = t[u].dl;
4239
add_j();
4340
}
4441
st.pop_back();
@@ -47,23 +44,25 @@ struct linear_kth_par {
4744
if (t[i].p == -1) dfs(dfs, i);
4845
if (t[i].p == -1 || t[t[i].p].dl != t[i].dl) {
4946
int v = t[i].dl, len = (t[v].d - t[i].d) * 2;
50-
t[v].idx_l = sz(l) + t[v].d;
51-
for (; v != -1 && len--; v = t[v].p)
52-
l.push_back(v);
47+
auto& lad = t[v].lad;
48+
for (; v != -1 && len--; v = t[v].p) lad += v;
5349
}
5450
}
5551
}
5652
int kth_par(int v, int k) {
5753
assert(0 <= k && k <= t[v].d);
5854
switch (k) {
59-
case 0: return v;
60-
case 1: return t[v].p;
61-
case 2: return t[t[v].p].p;
62-
default:
63-
int i = bit_floor(unsigned(k / 3));
64-
auto [j1, j2] = j[(t[v].idx_j & -i) | i];
65-
int up = t[v].d - t[j2].d <= k ? j2 : j1;
66-
return l[t[t[up].dl].idx_l - t[v].d + k];
55+
case 0:
56+
return v;
57+
case 1:
58+
return t[v].p;
59+
case 2:
60+
return t[t[v].p].p;
61+
default:
62+
int i = bit_floor(unsigned(k / 3));
63+
auto [j1, j2] = j[(t[v].idx_j & -i) | i];
64+
int leaf = t[t[v].d - t[j2].d <= k ? j2 : j1].dl;
65+
return t[leaf].lad[k + t[leaf].d - t[v].d];
6766
}
6867
}
6968
};

0 commit comments

Comments
 (0)