/tmp/solutions/build/vertex_add_path_sum-main.cpp:
1| |#include <common.h>
2| |#include <toy/bit.h>
3| |prelude;
4| |
5| |namespace {
6| |
7| |constexpr int N = 5e5;
8| |
9| |int head[N];
10| |struct {
11| | int to;
12| | int next;
13| |} edge[N * 2];
14| |int p[N];
15| |int l[N];
16| |int r[N];
17| |int a[N];
18| |u64 b[N + 1];
19| |u64 c[N + 2];
20| |
21| |} // namespace
22| |
23| 1|int main() {
24| 1| rd rd;
25| 1| wt wt;
26| 1| int n = rd.uh();
27| 1| int q = rd.uh();
28| 1|#ifdef LOCAL
29| 1| std::memset(head, 0, 4 * n);
30| 1| std::memset(c, 0, 8 * n + 16);
31| 1|#endif
32| 429k| for (int i = 0; i < n; ++i) a[i] = rd.uw();
^429k^429k
------------------
| Branch (32:19): [True: 100.00%, False: 0.00%]
------------------
33| 429k| for (int i = 1; i < n; ++i) {
^429k
------------------
| Branch (33:19): [True: 100.00%, False: 0.00%]
------------------
34| 429k| int u = rd.uh();
35| 429k| int v = rd.uh();
36| 429k| edge[i * 2 | 0] = {v, head[u]}, head[u] = i * 2 | 0;
37| 429k| edge[i * 2 | 1] = {u, head[v]}, head[v] = i * 2 | 1;
38| 429k| }
39| 1| p[0] = -1, l[0] = 1, b[1] = c[1] = a[0];
40| 1.28M| for (int u = 0, i = 1; u >= 0;) {
------------------
| Branch (40:26): [True: 100.00%, False: 0.00%]
------------------
41| 1.28M| if (int e = head[u]; e) {
------------------
| Branch (41:26): [True: 66.67%, False: 33.33%]
------------------
42| 858k| def[v, x] = edge[e];
43| 858k| head[u] = x;
44| 858k| if (v == p[u]) continue;
^429k
------------------
| Branch (44:11): [True: 50.00%, False: 50.00%]
------------------
45| 429k| p[v] = u;
46| 429k| l[v] = ++i;
47| 429k| c[i] += b[i] = a[v];
48| 429k| u = v;
49| 429k| } else {
50| 429k| c[r[u] = i + 1] -= a[u];
51| 429k| u = p[u];
52| 429k| }
53| 1.28M| }
54| 1| u64 sum = 0;
55| 429k| for (int i = 1; i <= n; ++i) c[i] = sum += c[i];
^429k^429k
------------------
| Branch (55:19): [True: 100.00%, False: 0.00%]
------------------
56| 429k| for (int i = n; i >= 1; --i) c[i] -= c[i - (i & -i)];
^429k^429k
------------------
| Branch (56:19): [True: 100.00%, False: 0.00%]
------------------
57| 1| int val[n + 1];
58| 429k| for (int i = 1; i < n; ++i) val[l[i]] = l[p[i]];
^429k^429k
------------------
| Branch (58:19): [True: 100.00%, False: 0.00%]
------------------
59| 1| ++n;
60| 1| int m = n / 64 + 1;
61| 1| int len = log(m) + 1;
62| 1| int table[len][m];
63| 1| int suf[n];
64| 1| int pre[n];
65| 429k| for (int min, i = 0; i < n; ++i) {
^429k
------------------
| Branch (65:24): [True: 100.00%, False: 0.00%]
------------------
66| 429k| int id = i & 63;
67| 429k| int value = pre[i] = val[i];
68| 429k| suf[i] = min = id ? std::min(min, value) : value;
^422k ^6.70k
------------------
| Branch (68:20): [True: 98.44%, False: 1.56%]
------------------
69| 429k| if (id == 63) table[0][i / 64] = suf[i];
^6.70k
------------------
| Branch (69:9): [True: 1.56%, False: 98.44%]
------------------
70| 429k| }
71| 429k| for (int min, i = n - 2; i >= 0; --i) {
^429k
------------------
| Branch (71:28): [True: 100.00%, False: 0.00%]
------------------
72| 429k| int id = ~i & 63;
73| 429k| int value = pre[i];
74| 429k| pre[i] = min = id ? std::min(min, value) : value;
^422k ^6.70k
------------------
| Branch (74:20): [True: 98.44%, False: 1.56%]
------------------
75| 429k| }
76| 13| for (int i = 1; i < len; ++i) {
^12
------------------
| Branch (76:19): [True: 92.31%, False: 7.69%]
------------------
77| 76.4k| for (int j = 0, k = 1 << (i - 1); k < m; ++j, ++k) {
^76.4k
------------------
| Branch (77:39): [True: 99.98%, False: 0.02%]
------------------
78| 76.4k| table[i][j] = std::min(table[i - 1][j], table[i - 1][k]);
79| 76.4k| }
80| 12| }
81| 25.8k| while (q--) {
------------------
| Branch (81:10): [True: 100.00%, False: 0.00%]
------------------
82| 25.8k| let t = rd.u1();
83| 25.8k| if (t == 0) {
------------------
| Branch (83:9): [True: 49.63%, False: 50.37%]
------------------
84| 12.8k| int k = rd.uh();
85| 12.8k| int x = rd.uw();
86| 12.8k| int u = l[k];
87| 12.8k| int v = r[k];
88| 12.8k| b[u] += x;
89| 137k| for (; u <= n; u += u & -u) c[u] += x;
^124k ^124k
------------------
| Branch (89:14): [True: 90.64%, False: 9.36%]
------------------
90| 137k| for (; v <= n; v += v & -v) c[v] -= x;
^124k ^124k
------------------
| Branch (90:14): [True: 90.65%, False: 9.35%]
------------------
91| 12.8k| }
92| 25.8k| if (t == 1) {
------------------
| Branch (92:9): [True: 50.37%, False: 49.63%]
------------------
93| 13.0k| int u = l[rd.uh()];
94| 13.0k| int v = l[rd.uh()];
95| 13.0k| if (u == v) {
------------------
| Branch (95:11): [True: 0.00%, False: 100.00%]
------------------
96| 0| wt.ud(b[u]);
97| 0| continue;
98| 0| }
99| 13.0k| int l = std::min(u, v) + 1;
100| 13.0k| int r = std::max(u, v);
101| 13.0k| int L = l / 64;
102| 13.0k| int R = r / 64;
103| 13.0k| int w;
104| 13.0k| if (L < R - 1) {
------------------
| Branch (104:11): [True: 99.95%, False: 0.05%]
------------------
105| 13.0k| int p = pre[l];
106| 13.0k| int s = suf[r];
107| 13.0k| w = std::min(p, s);
108| 13.0k| int k = log(R - L - 1);
109| 13.0k| int a = table[k][L + 1];
110| 13.0k| int b = table[k][R - (1 << k)];
111| 13.0k| int tmp = std::min(a, b);
112| 13.0k| w = std::min(w, tmp);
113| 13.0k| } else if (L == R - 1) {
^7 ^7
------------------
| Branch (113:18): [True: 57.14%, False: 42.86%]
------------------
114| 4| int p = pre[l];
115| 4| int s = suf[r];
116| 4| w = std::min(p, s);
117| 4| } else {
118| 3| w = val[l];
119| 101| for (int i = l + 1; i <= r; ++i) w = std::min(w, val[i]);
^98 ^98
------------------
| Branch (119:29): [True: 97.03%, False: 2.97%]
------------------
120| 3| }
121| 13.0k| u64 sum = b[w];
122| 13.0k| --l;
123| 127k| for (; l; l -= l & -l) sum += c[l];
^114k ^114k
------------------
| Branch (123:14): [True: 89.81%, False: 10.19%]
------------------
124| 137k| for (; r; r -= r & -r) sum += c[r];
^124k ^124k
------------------
| Branch (124:14): [True: 90.51%, False: 9.49%]
------------------
125| 94.6k| for (; w; w -= w & -w) sum -= c[w] * 2;
^81.6k ^81.6k
------------------
| Branch (125:14): [True: 86.25%, False: 13.75%]
------------------
126| 13.0k| wt.ud(sum);
127| 13.0k| }
128| 25.8k| }
129| 1| return 0;
130| 1|}