/tmp/solutions/build/vertex_add_path_sum-slow.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|       |int id;
   21|       |
   22|  53.3k|void dfs(int u, int w) {
   23|  53.3k|  p[u] = w;
   24|  53.3k|  l[u] = ++id;
   25|  53.3k|  c[id] += b[id] = a[u];
   26|   160k|  for (int e = head[u]; e; e = edge[e].next) {
                                         ^106k
  ------------------
  |  Branch (26:25): [True: 66.67%, False: 33.33%]
  ------------------
   27|   106k|    int v = edge[e].to;
   28|   106k|    if (v != w) {
  ------------------
  |  Branch (28:9): [True: 50.00%, False: 50.00%]
  ------------------
   29|  53.3k|      dfs(v, u);
   30|  53.3k|    }
   31|   106k|  }
   32|  53.3k|  c[r[u] = id + 1] -= a[u];
   33|  53.3k|}
   34|       |
   35|       |} // namespace
   36|       |
   37|      1|int main() {
   38|      1|  rd rd;
   39|      1|  wt wt;
   40|      1|  int n = rd.uh();
   41|      1|  int q = rd.uh();
   42|      1|#ifdef LOCAL
   43|      1|  id = 0;
   44|      1|  std::memset(head, 0, 4 * n);
   45|      1|  std::memset(c, 0, 8 * n + 16);
   46|      1|#endif
   47|  53.3k|  for (int i = 0; i < n; ++i) a[i] = rd.uw();
                                       ^53.3k^53.3k
  ------------------
  |  Branch (47:19): [True: 100.00%, False: 0.00%]
  ------------------
   48|  53.3k|  for (int i = 1; i < n; ++i) {
                                       ^53.3k
  ------------------
  |  Branch (48:19): [True: 100.00%, False: 0.00%]
  ------------------
   49|  53.3k|    int u = rd.uh();
   50|  53.3k|    int v = rd.uh();
   51|  53.3k|    edge[i * 2 | 0] = {v, head[u]}, head[u] = i * 2 | 0;
   52|  53.3k|    edge[i * 2 | 1] = {u, head[v]}, head[v] = i * 2 | 1;
   53|  53.3k|  }
   54|      1|  dfs(0, -1);
   55|      1|  u64 sum = 0;
   56|  53.3k|  for (int i = 1; i <= n; ++i) c[i] = sum += c[i];
                                        ^53.3k^53.3k
  ------------------
  |  Branch (56:19): [True: 100.00%, False: 0.00%]
  ------------------
   57|  53.3k|  for (int i = n; i >= 1; --i) c[i] -= c[i - (i & -i)];
                                        ^53.3k^53.3k
  ------------------
  |  Branch (57:19): [True: 100.00%, False: 0.00%]
  ------------------
   58|      1|  int val[n + 1];
   59|  53.3k|  for (int i = 1; i < n; ++i) val[l[i]] = l[p[i]];
                                       ^53.3k^53.3k
  ------------------
  |  Branch (59:19): [True: 100.00%, False: 0.00%]
  ------------------
   60|      1|  ++n;
   61|      1|  int m = n / 64 + 1;
   62|      1|  int len = log(m) + 1;
   63|      1|  int table[len][m];
   64|      1|  int suf[n];
   65|      1|  int pre[n];
   66|  53.3k|  for (int min, i = 0; i < n; ++i) {
                                            ^53.3k
  ------------------
  |  Branch (66:24): [True: 100.00%, False: 0.00%]
  ------------------
   67|  53.3k|    int id = i & 63;
   68|  53.3k|    int value = pre[i] = val[i];
   69|  53.3k|    suf[i] = min = id ? std::min(min, value) : value;
                                      ^52.5k                 ^834
  ------------------
  |  Branch (69:20): [True: 98.44%, False: 1.56%]
  ------------------
   70|  53.3k|    if (id == 63) table[0][i / 64] = suf[i];
                                ^833
  ------------------
  |  Branch (70:9): [True: 1.56%, False: 98.44%]
  ------------------
   71|  53.3k|  }
   72|  53.3k|  for (int min, i = n - 2; i >= 0; --i) {
                                                 ^53.3k
  ------------------
  |  Branch (72:28): [True: 100.00%, False: 0.00%]
  ------------------
   73|  53.3k|    int id = ~i & 63;
   74|  53.3k|    int value = pre[i];
   75|  53.3k|    pre[i] = min = id ? std::min(min, value) : value;
                                      ^52.5k                 ^833
  ------------------
  |  Branch (75:20): [True: 98.44%, False: 1.56%]
  ------------------
   76|  53.3k|  }
   77|     10|  for (int i = 1; i < len; ++i) {
                                         ^9
  ------------------
  |  Branch (77:19): [True: 90.00%, False: 10.00%]
  ------------------
   78|  7.00k|    for (int j = 0, k = 1 << (i - 1); k < m; ++j, ++k) {
                                                           ^6.99k
  ------------------
  |  Branch (78:39): [True: 99.87%, False: 0.13%]
  ------------------
   79|  6.99k|      table[i][j] = std::min(table[i - 1][j], table[i - 1][k]);
   80|  6.99k|    }
   81|      9|  }
   82|   382k|  while (q--) {
  ------------------
  |  Branch (82:10): [True: 100.00%, False: 0.00%]
  ------------------
   83|   382k|    let t = rd.u1();
   84|   382k|    if (t == 0) {
  ------------------
  |  Branch (84:9): [True: 50.01%, False: 49.99%]
  ------------------
   85|   191k|      int k = rd.uh();
   86|   191k|      int x = rd.uw();
   87|   191k|      int u = l[k];
   88|   191k|      int v = r[k];
   89|   191k|      b[u] += x;
   90|  1.76M|      for (; u <= n; u += u & -u) c[u] += x;
                                   ^1.57M       ^1.57M
  ------------------
  |  Branch (90:14): [True: 89.17%, False: 10.83%]
  ------------------
   91|  1.76M|      for (; v <= n; v += v & -v) c[v] -= x;
                                   ^1.57M       ^1.57M
  ------------------
  |  Branch (91:14): [True: 89.16%, False: 10.84%]
  ------------------
   92|   191k|    }
   93|   382k|    if (t == 1) {
  ------------------
  |  Branch (93:9): [True: 49.99%, False: 50.01%]
  ------------------
   94|   191k|      int u = l[rd.uh()];
   95|   191k|      int v = l[rd.uh()];
   96|   191k|      if (u == v) {
  ------------------
  |  Branch (96:11): [True: 0.00%, False: 100.00%]
  ------------------
   97|      2|        wt.ud(b[u]);
   98|      2|        continue;
   99|      2|      }
  100|   191k|      int l = std::min(u, v) + 1;
  101|   191k|      int r = std::max(u, v);
  102|   191k|      int L = l / 64;
  103|   191k|      int R = r / 64;
  104|   191k|      int w;
  105|   191k|      if (L < R - 1) {
  ------------------
  |  Branch (105:11): [True: 99.64%, False: 0.36%]
  ------------------
  106|   190k|        int p = pre[l];
  107|   190k|        int s = suf[r];
  108|   190k|        w = std::min(p, s);
  109|   190k|        int k = log(R - L - 1);
  110|   190k|        int a = table[k][L + 1];
  111|   190k|        int b = table[k][R - (1 << k)];
  112|   190k|        int tmp = std::min(a, b);
  113|   190k|        w = std::min(w, tmp);
  114|   190k|      } else if (L == R - 1) {
                           ^687^687
  ------------------
  |  Branch (114:18): [True: 63.46%, False: 36.54%]
  ------------------
  115|    436|        int p = pre[l];
  116|    436|        int s = suf[r];
  117|    436|        w = std::min(p, s);
  118|    436|      } else {
  119|    251|        w = val[l];
  120|  5.64k|        for (int i = l + 1; i <= r; ++i) w = std::min(w, val[i]);
                                                  ^5.39k^5.39k
  ------------------
  |  Branch (120:29): [True: 95.56%, False: 4.44%]
  ------------------
  121|    251|      }
  122|   191k|      u64 sum = b[w];
  123|   191k|      --l;
  124|  1.59M|      for (; l; l -= l & -l) sum += c[l];
                              ^1.40M       ^1.40M
  ------------------
  |  Branch (124:14): [True: 87.99%, False: 12.01%]
  ------------------
  125|  1.72M|      for (; r; r -= r & -r) sum += c[r];
                              ^1.53M       ^1.53M
  ------------------
  |  Branch (125:14): [True: 88.95%, False: 11.05%]
  ------------------
  126|  1.41M|      for (; w; w -= w & -w) sum -= c[w] * 2;
                              ^1.21M       ^1.21M
  ------------------
  |  Branch (126:14): [True: 86.45%, False: 13.55%]
  ------------------
  127|   191k|      wt.ud(sum);
  128|   191k|    }
  129|   382k|  }
  130|      1|  return 0;
  131|      1|}