Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. using namespace std;
  4. const int N = 200000;
  5.  
  6. class SegmentTree {
  7. public:
  8.     int t[N];
  9.     int n;
  10.     vector<int> a;
  11.     void init(vector<int> v) {
  12.         a = v;
  13.         n = v.size();
  14.         build(1, 0, n - 1);
  15.     }
  16.     void build(int v, int tl, int tr) {
  17.         if (tl == tr)
  18.             t[v] = a[tl];
  19.         else {
  20.             int tm = (tl + tr) >> 1;
  21.             build(v*2, tl, tm);
  22.             build(v*2+1, tm+1, tr);
  23.             t[v] = max(t[v*2], t[v*2+1]);
  24.         }
  25.     }
  26.     int q(int v, int tl, int tr, int l, int r) {
  27.         if (l > r)
  28.             return 0;
  29.         if (tl == l && tr == r)
  30.             return t[v];
  31.         int tm = (tl + tr) >> 1;
  32.         return max(q(v*2, tl, tm, l, min(tm, r)),
  33.                    q(v*2+1, tm+1, tr, max(l, tm+1), r));
  34.     }
  35.     void update(int v, int tl, int tr, int pos, int val) {
  36.         if (tl == tr)
  37.             t[v] = val;
  38.         else {
  39.             int tm = (tl + tr) >> 1;
  40.             if (pos <= tm)
  41.                 update(v*2, tl, tm, pos, val);
  42.             else
  43.                 update(v*2+1, tm+1, tr, pos, val);
  44.         }
  45.     }
  46. };
  47. vector<SegmentTree> t;
  48. vector<vector<int> > ch, g, lca;
  49. vector<int> sz, tin, tout, ind, chind, vals;
  50. int root, timer = 0, l;
  51.  
  52. int dfs(int v, int p = 0) {
  53.     if (g[v].size() == 1 && v != p) {
  54.         return 1;
  55.     }
  56.     int sum = 1;
  57.     for (int i = 0; i < g[v].size(); ++i) {
  58.         int to = g[v][i];
  59.         if (to != p) {
  60.             sum += dfs(to, v);
  61.         }
  62.     }
  63.     sz[v] = sum;
  64.     return sum;
  65. }
  66.  
  67. void dfs1(int v, int p = 0) {
  68.     tin[v] = ++timer;
  69.     lca[v][0] = p;
  70.     for (int i = 1; i <= l; ++i) {
  71.         lca[v][i] = lca[lca[v][i-1]][i-1];
  72.     }
  73.     for (int i = 0; i < g[v].size(); ++i) {
  74.         int to = g[v][i];
  75.         if (to != p)
  76.             dfs1(to, v);
  77.     }
  78.     tout[v] = ++timer;
  79. }
  80.  
  81. bool check(int a, int b) {
  82.     return tin[a] <= tin[b] && tout[a] >= tout[b];
  83. }
  84.  
  85. int get_lca(int a, int b) {
  86.     if (check(a, b)){
  87.         return a;
  88.     }
  89.     if (check(b, a))
  90.         return b;
  91.     for (int i = l; i >= 0; --i) {
  92.         if (!check(lca[a][i], b))
  93.             a = lca[a][i];
  94.     }
  95.     return lca[a][0];
  96. }
  97.  
  98. void hld(int v, int p, vector<int> &curChain) {
  99.     curChain.pb(v);
  100.     ind[v] = curChain.size() - 1;
  101.     chind[v] = ch.size() - 1;
  102.     int sc = -1, maxs = -1;
  103.     for (int i = 0; i < g[v].size(); ++i) {
  104.         int to = g[v][i];
  105.         if (to != p) {
  106.             if (maxs < sz[to]) {
  107.                 maxs = sz[to];
  108.                 sc = to;
  109.             }
  110.         }
  111.     }
  112.     if (sc == -1)
  113.         return;
  114.     hld(sc, v, curChain);
  115.     for (int i = 0; i < g[v].size(); ++i) {
  116.         int to = g[v][i];
  117.         if (to != p && to != sc) {
  118.             ch.pb(vector<int>());
  119.             hld(to, v, ch[ch.size()-1]);
  120.         }
  121.     }
  122. }
  123.  
  124. void hld_prepare() {
  125.     t.assign(ch.size(), SegmentTree());
  126.     for (int i = 0; i < ch.size(); ++i) {
  127.         vector<int> v;
  128.         for (int j = 0; j < ch[i].size(); ++j) {
  129.             v.pb(vals[ch[i][j]]);
  130.         }
  131.         t[i].init(v);
  132.     }
  133. }
  134.  
  135. int ni(int a, int b) {
  136.     int ans = -1;
  137.     int ach, bch;
  138.     while (1) {
  139.         ach = chind[a], bch = chind[b];
  140.         if (ach == bch) {
  141.             int cur = t[ach].q(1, 0, t[ach].n-1, ind[b], ind[a]);
  142.             ans = max(ans, cur);
  143.             break;
  144.         }
  145.         int cur = t[ach].q(1, 0, t[ach].n-1, 0, ind[a]);
  146.         ans = max(ans, cur);
  147.         a = ch[ach][0];
  148.         a = lca[a][0];
  149.     }
  150.     return ans;
  151. }
  152. int ichi(int a, int b) {
  153.     int c = get_lca(a, b);
  154.     return max(ni(a, c), ni(b, c));
  155. }
  156.  
  157. void san(int v, int val) {
  158.     t[chind[v]].update(1, 0, t[chind[v]].n-1, ind[v], val);
  159. }
  160.  
  161. int n, m;
  162. void init() {
  163.     g.assign(n, vector<int>());
  164.     sz.assign(n, 0);
  165.     ch.pb(vector<int>());
  166.     l = 1;
  167.     while((1<<l)<=n)++l;
  168.     lca.assign(n, vector<int>(l+1));
  169.     tin.assign(n, 0);
  170.     tout.assign(n, 0);
  171.     ind.assign(n, -1);
  172.     chind.assign(n, -1);
  173.     vals.assign(n, 0);
  174. }
  175.  
  176. int main() {
  177.     cin >> n;
  178.     m = n - 1;
  179.     init();
  180.     for (int i = 0; i < n; ++i) {
  181.         cin >> vals[i];
  182.     }
  183.     for (int i = 0; i < m; ++i) {
  184.         int a, b;
  185.         cin >> a >> b;
  186.         --a, --b;
  187.         g[a].pb(b);
  188.         g[b].pb(a);
  189.     }
  190.     root = 0;
  191.     dfs(root);
  192.     dfs1(root);
  193.     hld(root, root, ch[0]);
  194.     hld_prepare();
  195.     int q;
  196.     cin >> q;
  197.     for (int i = 0; i < q; ++i) {
  198.         char c;
  199.         int a, b;
  200.         cin >> c >> a >> b;
  201.         if (c == '?') {
  202.             cout << ichi(a-1, b-1) << endl;
  203.         }
  204.         else{
  205.             san(a-1, b);
  206.         }
  207.     }
  208.     return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement