/tmp/solutions/build/lca-slow.cpp:
1| |#include <common.h>
2| |prelude;
3| |
4| |namespace {
5| |
6| |constexpr int N = 5e5;
7| |
8| |int next[N];
9| |int head[N];
10| |int size[N];
11| |int depth[N];
12| |int heavy[N];
13| |int ances[N];
14| |int parent[N];
15| |
16| 389k|def build_step_1(int u, int d) -> void {
17| 389k| size[u] = 1;
18| 389k| depth[u] = d;
19| 779k| for (int v = head[u]; v; v = next[v]) {
^389k
------------------
| Branch (19:25): [True: 50.00%, False: 50.00%]
------------------
20| 389k| build_step_1(v, d + 1);
21| 389k| size[u] += size[v];
22| 389k| if (heavy[u] == 0 || size[v] > size[heavy[u]]) {
^195k
------------------
| Branch (22:9): [True: 49.97%, False: 50.03%]
| Branch (22:26): [True: 46.65%, False: 53.35%]
------------------
23| 285k| heavy[u] = v;
24| 285k| }
25| 389k| }
26| 389k|}
27| |
28| 389k|def build_step_2(int u, int a) -> void {
29| 389k| ances[u] = a;
30| 779k| for (int v = head[u]; v; v = next[v]) {
^389k
------------------
| Branch (30:25): [True: 50.00%, False: 50.00%]
------------------
31| 389k| if (v != heavy[u]) {
------------------
| Branch (31:9): [True: 50.03%, False: 49.97%]
------------------
32| 195k| build_step_2(v, v);
33| 195k| }
34| 389k| }
35| 389k| if (heavy[u]) build_step_2(heavy[u], a);
^194k
------------------
| Branch (35:7): [True: 49.97%, False: 50.03%]
------------------
36| 389k|}
37| |
38| 410k|def lca(int u, int v) -> int {
39| 3.99M| while (ances[u] != ances[v]) {
------------------
| Branch (39:10): [True: 89.72%, False: 10.28%]
------------------
40| 3.58M| if (depth[ances[u]] > depth[ances[v]]) {
------------------
| Branch (40:9): [True: 48.66%, False: 51.34%]
------------------
41| 1.74M| u = parent[ances[u]];
42| 1.84M| } else {
43| 1.84M| v = parent[ances[v]];
44| 1.84M| }
45| 3.58M| }
46| 410k| return depth[u] < depth[v] ? u : v;
^145k^265k
------------------
| Branch (46:10): [True: 35.46%, False: 64.54%]
------------------
47| 410k|}
48| |
49| |} // namespace
50| |
51| 1|int main() {
52| 1| rd rd;
53| 1| wt wt;
54| 1| int n = rd.uh();
55| 1| int q = rd.uh();
56| 1|#ifdef LOCAL
57| 1| std::memset(head, 0, 4 * n);
58| 1| std::memset(heavy, 0, 4 * n);
59| 1| std::memset(parent, 0, 4 * n);
60| 1|#endif
61| 389k| for (int i = 1; i < n; ++i) {
^389k
------------------
| Branch (61:19): [True: 100.00%, False: 0.00%]
------------------
62| 389k| int p = rd.uh();
63| 389k| parent[i] = p;
64| 389k| next[i] = head[p];
65| 389k| head[p] = i;
66| 389k| }
67| 1| build_step_1(0, 0);
68| 1| build_step_2(0, 0);
69| 410k| while (q--) {
------------------
| Branch (69:10): [True: 100.00%, False: 0.00%]
------------------
70| 410k| int u = rd.uh();
71| 410k| int v = rd.uh();
72| 410k| int w = lca(u, v);
73| 410k| wt.uw(w);
74| 410k| }
75| 1| return 0;
76| 1|}