/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|}