Advertisement
skaram

Untitled

Dec 13th, 2022 (edited)
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. //// @author s_k_a_r_a
  2. // #pragma GCC optimize("Ofast")
  3. #include <bits/stdc++.h>
  4. #include <ext/pb_ds/assoc_container.hpp>
  5.  
  6. #ifdef Local
  7. #include "debug.h"
  8. #else
  9. #define debug(...)
  10. #endif
  11.  
  12. #define int long long
  13.  
  14. typedef long long ll;
  15. typedef long double ld;
  16.  
  17. #define vec vector
  18. #define str string
  19. #define all(x) (x).begin(), (x).end()
  20. #define rall(x) (x).rbegin(), (x).rend()
  21. #define sz(x) (int)(x).size()
  22. #define pb push_back
  23.  
  24. using namespace std;
  25.  
  26. namespace st {
  27. #ifdef Local
  28. static const int N = 4;
  29. #else
  30. static const int N = 64 * 1024;
  31. #endif
  32. int tree[2 * N - 1]{};
  33.  
  34. int iq, dq;
  35.  
  36. void upd(int i, int l, int r) {
  37.     if (r - l == 1)
  38.         tree[i] = dq;
  39.     else {
  40.         int m = (l + r) / 2;
  41.         if (iq < m)
  42.             upd(2 * i + 1, l, m);
  43.         else
  44.             upd(2 * i + 2, m, r);
  45.         tree[i] = max(tree[2 * i + 1], tree[2 * i + 2]);
  46.     }
  47. }
  48.  
  49. void upd(int i, int d) {
  50.     iq = i, dq = d;
  51.     upd(0, 0, N);
  52. }
  53.  
  54. int lq, rq;
  55.  
  56. int get(int i, int l, int r) {
  57.     if (lq <= l && r <= rq)
  58.         return tree[i];
  59.     int m = (l + r) / 2;
  60.     int res = 0;
  61.     if (lq < m)
  62.         res = max(res, get(2 * i + 1, l, m));
  63.     if (m < rq)
  64.         res = max(res, get(2 * i + 2, m, r));
  65.     return res;
  66. }
  67.  
  68. int get(int l, int r) {
  69.     lq = l, rq = r + 1;
  70.     return get(0, 0, N);
  71. }
  72. }  // namespace st
  73.  
  74. static const int N = 50050;
  75. vec<int> g[N];
  76. int sz[N];
  77.  
  78. void stdfs(int v, int p = -1) {
  79.     sz[v] = 1;
  80.     if (g[v].front() == p && sz(g[v]) > 1)
  81.         swap(g[v][0], g[v][1]);
  82.     for (int& u : g[v])
  83.         if (u != p) {
  84.             stdfs(u, v), sz[v] += sz[u];
  85.             if (sz[u] > sz[g[v].front()])
  86.                 swap(g[v][0], u);
  87.         }
  88. }
  89.  
  90. int tin[N], tout[N], t = 0, depth[N], head[N], par[N];
  91. vec<int> eu;
  92.  
  93. void eubuild(int v, int p = -1, int h = -1) {
  94.     tin[v] = t++;
  95.     par[v] = p;
  96.     eu.pb(v);
  97.     if (p == -1)
  98.         p = v;
  99.     depth[v] = depth[p] + 1;
  100.     if (h == -1)
  101.         h = v;
  102.     head[v] = h;
  103.     int k = g[v].front();
  104.     if (k != p)
  105.         eubuild(k, v, h);
  106.     for (int& u : g[v])
  107.         if (u != p && u != k)
  108.             eubuild(u, v);
  109.     tout[v] = t;
  110. }
  111.  
  112. bool ispar(int p, int v) {
  113.     return tin[p] <= tin[v] && tout[v] <= tout[p];
  114. }
  115.  
  116. void solve() {
  117.     int n;
  118.     cin >> n;
  119.     vec<int> h(n);
  120.     for (int& i : h)
  121.         cin >> i;
  122.     if (n == 1) {
  123.         int q;
  124.         cin >> q;
  125.         char mode;
  126.         for (int v, hp; q--;) {
  127.             cin >> mode >> v >> hp;
  128.             if (mode == '!')
  129.                 h[0] = hp;
  130.             else
  131.                 cout << h[0] << '\n';
  132.         }
  133.         return;
  134.     }
  135.     for (int i = 0, v, u; i < n - 1; i++) {
  136.         cin >> v >> u, v--, u--;
  137.         g[v].pb(u), g[u].pb(v);
  138.     }
  139.     stdfs(0);
  140.     eubuild(0);
  141.     debug(eu);
  142.     for (int i = 0, v; i < n; i++) {
  143.         v = eu[i];
  144.         st::upd(i, h[v]);
  145.     }
  146.     int q;
  147.     cin >> q;
  148.     char mode;
  149.     for (int v, u, hp, res; q--;) {
  150.         cin >> mode >> v, v--;
  151.         if (mode == '!') {
  152.             cin >> hp;
  153.             h[v] = hp;
  154.             st::upd(tin[v], hp);
  155.         } else {
  156.             cin >> u, u--;
  157.             res = 0;
  158.             while (!ispar(head[v], u)) {
  159.                 if (head[v] == v)
  160.                     res = max(res, h[v]), v = par[v];
  161.                 else
  162.                     res = max(res, st::get(tin[head[v]], tin[v])), v = par[head[v]];
  163.             }
  164.             while (!ispar(head[u], v)) {
  165.                 if (head[u] == u)
  166.                     res = max(res, h[u]), u = par[u];
  167.                 else
  168.                     res = max(res, st::get(tin[head[u]], tin[u])), u = par[head[u]];
  169.             }
  170.             if (depth[v] < depth[u])
  171.                 res = max(res, st::get(tin[v], tin[u]));
  172.             else
  173.                 res = max(res, st::get(tin[u], tin[v]));
  174.             cout << res << '\n';
  175.         }
  176.     }
  177. }
  178.  
  179. signed main() {
  180.     ios::sync_with_stdio(false);
  181.     cin.tie(nullptr);
  182.  
  183.     int tt = 1;
  184.     //    cin >> tt;
  185.     while (tt--)
  186.         solve();
  187.  
  188.     return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement