/tmp/solutions/build/range_reverse_range_sum-main.cpp:
1| |#include <common.h>
2| |prelude;
3| |
4| |namespace {
5| |
6| |constexpr int N = 200003;
7| |
8| |struct Node {
9| | int val;
10| | u64 sum;
11| | int rev;
12| | int size;
13| | int l, r;
14| |} node[N];
15| |
16| 75.2M|def maintain(int x) -> void {
17| 75.2M| node[x].size = node[node[x].l].size + 1 + node[node[x].r].size;
18| 75.2M| node[x].sum = node[node[x].l].sum + node[x].val + node[node[x].r].sum;
19| 75.2M|}
20| |
21| 3.42M|def build(int l, int r) -> int {
22| 3.42M| if (l > r) return 0;
^1.71M
------------------
| Branch (22:7): [True: 50.00%, False: 50.00%]
------------------
23| 1.71M| int m = (l + r) / 2;
24| 1.71M| node[m].l = build(l, m - 1);
25| 1.71M| node[m].r = build(m + 1, r);
26| 1.71M| maintain(m);
27| 1.71M| return m;
28| 3.42M|}
29| |
30| 78.0M|def pushdown(int x) -> void {
31| 78.0M| if (node[x].rev) {
------------------
| Branch (31:7): [True: 36.34%, False: 63.66%]
------------------
32| 28.3M| std::swap(node[x].l, node[x].r);
33| 28.3M| node[node[x].l].rev ^= 1;
34| 28.3M| node[node[x].r].rev ^= 1;
35| 28.3M| node[x].rev = 0;
36| 28.3M| }
37| 78.0M|}
38| |
39| 1.13M|def reverse(int x) -> void {
40| 1.13M| if (x == 0) return;
^115k
------------------
| Branch (40:7): [True: 10.25%, False: 89.75%]
------------------
41| 1.01M| node[x].rev ^= 1;
42| 1.01M|}
43| |
44| 36.5M|def zig(int &x) -> void {
45| 36.5M| int l = node[x].l;
46| 36.5M| node[x].l = node[l].r;
47| 36.5M| maintain(x);
48| 36.5M| node[l].r = x;
49| 36.5M| x = l;
50| 36.5M|}
51| |
52| 36.9M|def zag(int &x) -> void {
53| 36.9M| int r = node[x].r;
54| 36.9M| node[x].r = node[r].l;
55| 36.9M| maintain(x);
56| 36.9M| node[r].l = x;
57| 36.9M| x = r;
58| 36.9M|}
59| |
60| 40.2M|def splay(int &x, int k) -> void {
61| 40.2M| pushdown(x);
62| 40.2M| if (int &l = node[x].l, &r = node[x].r, size = node[l].size; k == size) {
------------------
| Branch (62:64): [True: 6.10%, False: 93.90%]
------------------
63| 2.45M| return;
64| 37.7M| } else if (k < size) {
------------------
| Branch (64:14): [True: 49.25%, False: 50.75%]
------------------
65| 18.6M| pushdown(l);
66| 18.6M| if (int &ll = node[l].l, &lr = node[l].r, size = node[ll].size; k == size) {
------------------
| Branch (66:69): [True: 5.58%, False: 94.42%]
------------------
67| 1.03M| zig(x);
68| 17.5M| } else if (k < size) {
------------------
| Branch (68:16): [True: 48.45%, False: 51.55%]
------------------
69| 8.51M| splay(ll, k);
70| 8.51M| zig(x);
71| 8.51M| zig(x);
72| 9.05M| } else {
73| 9.05M| splay(lr, k - size - 1);
74| 9.05M| zag(l);
75| 9.05M| zig(x);
76| 9.05M| }
77| 19.1M| } else {
78| 19.1M| pushdown(r);
79| 19.1M| k -= size + 1;
80| 19.1M| if (int &rl = node[r].l, &rr = node[r].r, size = node[rl].size; k == size) {
------------------
| Branch (80:69): [True: 5.38%, False: 94.62%]
------------------
81| 1.03M| zag(x);
82| 18.1M| } else if (k < size) {
------------------
| Branch (82:16): [True: 51.91%, False: 48.09%]
------------------
83| 9.42M| splay(rl, k);
84| 9.42M| zig(r);
85| 9.42M| zag(x);
86| 9.42M| } else {
87| 8.72M| splay(rr, k - size - 1);
88| 8.72M| zag(x);
89| 8.72M| zag(x);
90| 8.72M| }
91| 19.1M| }
92| 40.2M|}
93| |
94| |} // namespace
95| |
96| 20|int main() {
97| 20| rd rd;
98| 20| wt wt;
99| 20| int n = rd.uh();
100| 20| int q = rd.uh();
101| 20|#ifdef LOCAL
102| 20| std::memset(node, 0, sizeof(Node) * (n + 3));
103| 20|#endif
104| 1.71M| for (int i = 2; i <= n + 1; ++i) node[i].val = rd.uw();
^1.71M^1.71M
------------------
| Branch (104:19): [True: 100.00%, False: 0.00%]
------------------
105| 20| int x = build(1, n + 2);
106| 20| if (n == 0) rd.skip(1);
^3
------------------
| Branch (106:7): [True: 15.00%, False: 85.00%]
------------------
107| 2.26M| while (q--) {
------------------
| Branch (107:10): [True: 100.00%, False: 0.00%]
------------------
108| 2.26M| int t = rd.u1();
109| 2.26M| int l = rd.uh();
110| 2.26M| int r = rd.uh();
111| 2.26M| splay(x, l);
112| 2.26M| splay(node[x].r, r - l);
113| 2.26M| if (t == 0) {
------------------
| Branch (113:9): [True: 49.99%, False: 50.01%]
------------------
114| 1.13M| reverse(node[node[x].r].l);
115| 1.13M| }
116| 2.26M| if (t == 1) {
------------------
| Branch (116:9): [True: 50.01%, False: 49.99%]
------------------
117| 1.13M| wt.ud(node[node[node[x].r].l].sum);
118| 1.13M| }
119| 2.26M| }
120| 20| return 0;
121| 20|}