Skip to content

Commit 29d41ff

Browse files
committed
saving progress
1 parent 714a135 commit 29d41ff

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

library/trees/ladder_decomposition/linear_kth_par.hpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@
99
//! @space O(n)
1010
struct linear_kth_par {
1111
struct node {
12-
int d, p = -1, idx, dl;
13-
vi lad;
12+
int d, p = -1, idx, dl, tin;
1413
};
1514
vector<node> t;
1615
vector<pii> j;
17-
linear_kth_par(const vector<vi>& adj):
18-
t(sz(adj)), j(2 * sz(t)) {
16+
vi lad;
17+
vi head;
18+
linear_kth_par(const vector<vi>& adj) : t(sz(adj)), j(2 * sz(t)), head(sz(adj)) {
1919
vi st;
2020
int pos = 1;
2121
auto add_j = [&]() -> void {
2222
j[pos] = {st[max(0, sz(st) - 1 - 2 * (pos & -pos))],
23-
st[max(0, sz(st) - 1 - 4 * (pos & -pos))]};
23+
st[max(0, sz(st) - 1 - 4 * (pos & -pos))]};
2424
pos++;
2525
};
2626
auto dfs = [&](auto&& self, int v) -> void {
@@ -40,26 +40,28 @@ struct linear_kth_par {
4040
rep(i, 0, sz(t)) {
4141
if (t[i].p == -1) dfs(dfs, i);
4242
if (t[i].p == -1 || t[t[i].p].dl != t[i].dl) {
43-
int leaf = t[i].dl;
44-
vi& lad = t[leaf].lad;
45-
lad.resize(
46-
min((t[leaf].d - t[i].d) * 2, t[leaf].d + 1),
47-
leaf);
48-
rep(k, 1, sz(lad)) lad[k] = t[lad[k - 1]].p;
43+
head[t[i].dl] = i;
44+
for (int u = i, v = t[i].dl; u != -1 && v != i; u = t[u].p, v = t[v].p)
45+
t[v].tin = sz(lad), lad.push_back(u);
4946
}
5047
}
5148
}
5249
int kth_par(int v, int k) {
5350
assert(0 <= k && k <= t[v].d);
5451
switch (k) {
55-
case 0: return v;
56-
case 1: return t[v].p;
57-
case 2: return t[t[v].p].p;
58-
default:
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;
62-
return t[leaf].lad[k + t[leaf].d - t[v].d];
52+
case 0: return v;
53+
case 1: return t[v].p;
54+
case 2: return t[t[v].p].p;
55+
default:
56+
int i = 1 << __lg(k / 3);
57+
auto [j1, j2] = j[(t[v].idx & -i) | i];
58+
int up = t[v].d - t[j2].d <= k ? j2 : j1;
59+
int leaf = t[up].dl;
60+
assert(t[head[leaf]].d >= t[v].d - k);
61+
int res = lad[t[leaf].tin + t[head[leaf]].d - (t[v].d - k)];
62+
// cerr << "hi: " << t[res].d << ' ' << t[v].d - k << endl;
63+
return res;
64+
// return t[leaf].lad[k + t[leaf].d - t[v].d];
6365
}
6466
}
6567
};

0 commit comments

Comments
 (0)