Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. ofstream fout("heavypath.out");
  5. ifstream fin("heavypath.in");
  6.  
  7. const int NMax = 100010;
  8. int niv[NMax];
  9. int sub[NMax];
  10. int path[NMax];
  11. vector<int> P[NMax];
  12. vector<int> G[NMax];
  13. int parent[NMax];
  14. int val[NMax];
  15. int k, n, m, x, y;
  16. int T[NMax][NMax];
  17.  
  18. void makePaths(int node, int prev, int level){
  19.     int maxi = 0;
  20.     int connect = 0;
  21.  
  22.     niv[node] = level;
  23.  
  24.     for(int i = 0; i < G[node].size(); i++){
  25.         int next = G[node][i];
  26.         if(next == prev) continue;
  27.  
  28.         makePaths(next, node, level + 1);
  29.         if(sub[next] > maxi){
  30.             maxi = sub[next];
  31.             connect = next;
  32.         }
  33.     }
  34.  
  35.     if(!maxi){
  36.         P[++k].push_back(node);
  37.         path[node] = k;
  38.         sub[node] = 1;
  39.         return;
  40.     }
  41.  
  42.     P[path[connect]].push_back(node);
  43.     path[node] = path[connect];
  44.     sub[node] = sub[connect];
  45.  
  46.     for(int i = 0; i < G[node].size(); i++){
  47.         int next = G[node][i];
  48.         if(next == prev) continue;
  49.  
  50.         if(next != connect){
  51.             parent[path[next]] = node;
  52.         }
  53.     }
  54. }
  55.  
  56. void reversePaths()
  57. {
  58.     for(int i = 1; i <= k; i++){
  59.         reverse(P[i].begin(), P[i].end());
  60.     }
  61. }
  62.  
  63. void update(int t[], int pos, int st, int dr, int val){
  64.     if(st == dr){
  65.         t[pos] = val;
  66.         return;
  67.     }
  68.  
  69.     int mid = (st + dr) / 2;
  70.  
  71.     if(pos <= mid) update(t, pos * 2, st, mid, val);
  72.     else update(t, pos * 2 + 1, mid + 1, dr, val);
  73.  
  74.     t[pos] = max(t[pos * 2], t[pos * 2 + 1]);
  75. }
  76.  
  77. int maxim(int t[], int st, int dr, int l, int r, int pos){
  78.      if(st==l && dr==r)
  79.     {
  80.         return t[pos];
  81.     }
  82.  
  83.     int mij = (l+r)/2, nr1 = 0, nr2 = 0;
  84.  
  85.     if(st <= mij) nr1 = maxim(t, st, min(dr, mij), l, mij, pos * 2);
  86.     if(dr > mij)  nr2 = maxim(t, max(mij+1, st), dr, mij + 1, r, pos * 2 + 1);
  87.  
  88.     return max(nr1,nr2);
  89. }
  90.  
  91. void makeTrees(){
  92.     for(int i = 1; i <= k; i++){
  93.         for(int j = 0; j < P[i].size(); j++){
  94.             update(T[i], 1, 1, P[i].size(), val[P[i][j]]);
  95.             pos[P[i][j]] = j;
  96.         }
  97.     }
  98. }
  99.  
  100. int solve2(int x, int y){
  101.     int rez = val[x];
  102.  
  103.  
  104.     while(x != y){
  105.         if(niv[parent[path[x]]] < niv[parent[path[y]]]) swap(x, y);
  106.  
  107.         if(path[x] == path[y]){
  108.             rez = max(rez, maxim(T[path[x]], min(pos[x], pos[y]), max(pos[x],pos[y]), 1, P[path[x]].size()), 1);
  109.             y = x;
  110.         }
  111.  
  112.         else{
  113.             rez = max(rez, maxim(T[path[x]], 1, pos[x], 1, P[path[x]].size()), 1);
  114.             x = parent[path[x]];
  115.         }
  116.     }
  117.  
  118.     return rez;
  119. }
  120.  
  121. void query(){
  122.     for(int i = 1; i <= m; i++){
  123.         fin >> o >> x >> y;
  124.         if(o == 1){
  125.             val[x] = y;
  126.             update(path[x], 1, 1, P[path[x]].size(), y);
  127.         }
  128.  
  129.         else{
  130.             fout << solve2(x, y) << '\n';
  131.         }
  132.     }
  133. }
  134.  
  135. int main()
  136. {
  137.     fin >> n >> m;
  138.  
  139.     for(int i = 1; i <= n; i++) fin >> val[i];
  140.     for(int i = 1; i < n; i++){
  141.         fin >> x >> y;
  142.  
  143.         G[x].push_back(y);
  144.         G[y].push_back(x);
  145.     }
  146.  
  147.     makePaths(1, 0, 0);
  148.     reversePaths();
  149.     makeTrees();
  150.     query();
  151.  
  152.  
  153.     return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement