Rentib

Untitled

Feb 5th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<pair<int, int>> G[500007];
  4. int up[19][500007], maks[19][500007], odl[500007];
  5. int pre[500007], pos[500007], pr, po;
  6. void DFS(int a, int vater, int d)
  7. {
  8.   pre[a] = ++pr;
  9.   odl[a] = d;
  10.   up[a][0] = vater;
  11.   up[a][1] = up[up[a][0]][0];
  12.   for(int i = 2;i < 19;i++)
  13.   {
  14.     up[a][i] = up[up[a][i - 1]][i - 1];
  15.     maks[a][i] = max(maks[a][i - 1], maks[up[a][i - 1]][i - 1]);
  16.   }
  17.   for(auto i : G[a])
  18.     if(i.first != vater){
  19.       maks[i.first][1] = i.second;
  20.       DFS(i.first, a, d + 1);
  21.     }
  22.   pos[a] = ++po;
  23. }
  24. bool ancestor(int u, int v)
  25. {
  26.   return pre[u] <= pre[v] && pos[u] >= pos[v];
  27. }
  28. int LCA(int u, int v)
  29. {
  30.   if(ancestor(u, v))
  31.     return u;
  32.   if(ancestor(v, u))
  33.     return v;
  34.   for(int i = 18;i >= 0;i--)
  35.   {
  36.     if(ancestor(up[u][i], v))
  37.       u = up[u][i];
  38.   }
  39.   return up[u][0];
  40. }
  41. int Maks(int a, int k)
  42. {
  43.   int m = 0;
  44.   if(odl[a] > k)
  45.     m = max(m, maks[a][1]);
  46.   for(int i = 18;i >= 0;i--)
  47.   {
  48.     if(odl[up[a][i]] < k)
  49.       continue;
  50.     m = max(m, maks[a][i]);
  51.     a = up[a][i];
  52.   }
  53.   return m;
  54. }
  55. int main()
  56. {
  57.   ios_base::sync_with_stdio(0);
  58.   cin.tie(0);
  59.   cout.tie(0);
  60.   int n, a, b;
  61.   cin >> n;
  62.   for(int i = 1, c;i < n;i++)
  63.   {
  64.     cin >> a >> b >> c;
  65.     G[a].emplace_back(b, c);
  66.     G[b].emplace_back(a, c);
  67.   }
  68.   DFS(1, 1, 0);
  69.   while(cin >> a)
  70.   {
  71.     if(a == -1) break;
  72.     cin >> b;
  73.     int k = odl[LCA(a, b)];
  74.     cout << max(Maks(a, k), Maks(b, k)) << '\n';
  75.   }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment