Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- vector<pair<int, int>> G[500007];
- int up[19][500007], maks[19][500007], odl[500007];
- int pre[500007], pos[500007], pr, po;
- void DFS(int a, int vater, int d)
- {
- pre[a] = ++pr;
- odl[a] = d;
- up[a][0] = vater;
- up[a][1] = up[up[a][0]][0];
- for(int i = 2;i < 19;i++)
- {
- up[a][i] = up[up[a][i - 1]][i - 1];
- maks[a][i] = max(maks[a][i - 1], maks[up[a][i - 1]][i - 1]);
- }
- for(auto i : G[a])
- if(i.first != vater){
- maks[i.first][1] = i.second;
- DFS(i.first, a, d + 1);
- }
- pos[a] = ++po;
- }
- bool ancestor(int u, int v)
- {
- return pre[u] <= pre[v] && pos[u] >= pos[v];
- }
- int LCA(int u, int v)
- {
- if(ancestor(u, v))
- return u;
- if(ancestor(v, u))
- return v;
- for(int i = 18;i >= 0;i--)
- {
- if(ancestor(up[u][i], v))
- u = up[u][i];
- }
- return up[u][0];
- }
- int Maks(int a, int k)
- {
- int m = 0;
- if(odl[a] > k)
- m = max(m, maks[a][1]);
- for(int i = 18;i >= 0;i--)
- {
- if(odl[up[a][i]] < k)
- continue;
- m = max(m, maks[a][i]);
- a = up[a][i];
- }
- return m;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int n, a, b;
- cin >> n;
- for(int i = 1, c;i < n;i++)
- {
- cin >> a >> b >> c;
- G[a].emplace_back(b, c);
- G[b].emplace_back(a, c);
- }
- DFS(1, 1, 0);
- while(cin >> a)
- {
- if(a == -1) break;
- cin >> b;
- int k = odl[LCA(a, b)];
- cout << max(Maks(a, k), Maks(b, k)) << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment