Guest User

Juanzhang

a guest
Jun 5th, 2019
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 8e4 + 10;
  5. int tid[maxn], fa[maxn], sz[maxn], dep[maxn], son[maxn], top[maxn];
  6. int n, m, len, qtot, val[maxn], ans[maxn], Q[maxn * 3], Q1[maxn * 3], Q2[maxn * 3];
  7.  
  8. struct node {
  9.   int k, u, v, tid;
  10.  
  11.   node() {}
  12.   node(int _k, int _u, int _v, int _t) :
  13.     k(_k), u(_u), v(_v), tid(_t) {}
  14. } a[maxn * 3];
  15.  
  16. struct BIT {
  17.   int now, c[maxn], T[maxn];
  18.  
  19.   void clr() { now++; }
  20.  
  21.   void _add(int pos, int v) {
  22.     for (; pos <= n; pos += pos & -pos) {
  23.       T[pos] < now ? c[pos] = v, T[pos] = now : c[pos] += v;
  24.     }
  25.   }
  26.  
  27.   int query(int pos) {
  28.     int res = 0;
  29.     for (; pos; pos &= pos - 1) {
  30.       if (T[pos] == now) res += c[pos];
  31.     }
  32.     return res;
  33.   }
  34.  
  35.   void add(int u, int x) {
  36.     _add(tid[u], x), _add(tid[u] + sz[u], -x);
  37.   }
  38. } bit;
  39.  
  40. vector <int> e[maxn];
  41.  
  42. int dfs1(int u, int f) {
  43.   fa[u] = f, dep[u] = dep[f] + 1;
  44.   for (int v : e[u]) {
  45.     if (v != f) {
  46.       sz[u] += dfs1(v, u);
  47.       if (sz[son[u]] < sz[v]) son[u] = v;
  48.     }
  49.   }
  50.   return ++sz[u];
  51. }
  52.  
  53. void dfs2(int u, int tp) {
  54.   static int now;
  55.   tid[u] = ++now, top[u] = tp;
  56.   if (son[u]) dfs2(son[u], tp);
  57.   for (int v : e[u]) {
  58.     if (v != fa[u] && v != son[u]) {
  59.       dfs2(v, v);
  60.     }
  61.   }
  62. }
  63.  
  64. int lca(int u, int v) {
  65.   for (; top[u] != top[v]; u = fa[top[u]]) {
  66.     if (dep[top[u]] < dep[top[v]]) swap(u, v);
  67.   }
  68.   return dep[u] < dep[v] ? u : v;
  69. }
  70.  
  71. int query(int u, int v) {
  72.   int _lca = lca(u, v);
  73.   return bit.query(tid[u]) + bit.query(tid[v]) - bit.query(tid[_lca]) - bit.query(tid[fa[_lca]]);
  74. }
  75.  
  76. void divide(int l, int r, int ql, int qr) {
  77.   if (l > r) return;
  78.   if (ql == qr) {
  79.     for (int i = l; i <= r; i++) {
  80.       ans[a[Q[i]].tid] = ql;
  81.     }
  82.     return;
  83.   }
  84.   bit.clr();
  85.   int mid = (ql + qr) >> 1, p1 = 0, p2 = 0;
  86.   for (int i = l; i <= r; i++) {
  87.     node &tmp = a[Q[i]];
  88.     if (!tmp.tid) {
  89.       tmp.v > mid ? bit.add(tmp.u, tmp.k), Q2[++p2] = Q[i] : Q1[++p1] = Q[i];
  90.     } else {
  91.       int s = query(tmp.u, tmp.v);
  92.       tmp.k > s ? Q1[++p1] = Q[i], tmp.k -= s : Q2[++p2] = Q[i];
  93.     }
  94.   }
  95.   for (int i = 1; i <= p1; i++) {
  96.     Q[l + i - 1] = Q1[i];
  97.   }
  98.   for (int i = 1; i <= p2; i++) {
  99.     Q[r - p2 + i] = Q2[i];
  100.   }
  101.   divide(l, l + p1 - 1, ql, mid);
  102.   divide(l + p1, r, mid + 1, qr);
  103. }
  104.  
  105. int main() {
  106.   scanf("%d %d", &n, &m);
  107.   for (int i = 1; i <= n; i++) {
  108.     scanf("%d", val + i);
  109.     a[++len] = node(1, i, val[i], 0);
  110.   }
  111.   for (int i = 1; i < n; i++) {
  112.     int u, v;
  113.     scanf("%d %d", &u, &v);
  114.     e[u].push_back(v), e[v].push_back(u);
  115.   }
  116.   dfs1(1, 0), dfs2(1, 1);
  117.   for (int i = 1; i <= n; i++) {
  118.     bit.add(i, 1);
  119.   }
  120.   for (int i = 1; i <= m; i++) {
  121.     int k, u, v;
  122.     scanf("%d %d %d", &k, &u, &v);
  123.     if (!k) {
  124.       a[++len] = node(-1, u, val[u], 0);
  125.       a[++len] = node(1, u, val[u] = v, 0);
  126.     } else {
  127.       if (query(u, v) < k) {
  128.         ans[++qtot] = -1;
  129.       } else {
  130.         a[++len] = node(k, u, v, ++qtot);
  131.       }
  132.     }
  133.   }
  134.   for (int i = 1; i <= len; i++) {
  135.     Q[i] = i;
  136.   }
  137.   divide(1, len, 0, 1e8);
  138.   for (int i = 1; i <= qtot; i++) {
  139.     if (~ans[i]) {
  140.       printf("%d\n", ans[i]);
  141.     } else {
  142.       puts("invalid request!");
  143.     }
  144.   }
  145.   return 0;
  146. }
Add Comment
Please, Sign In to add comment