Advertisement
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[500007][19], maks[500007][19];
- int pre[500007], pos[500007], pr, po;
- void DFS(int a, int vater){
- pre[a] = ++pr;
- up[a][0] = vater;
- for(int i = 1;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][0] = i.second;
- DFS(i.first, a);
- }
- 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 = -INT_MAX;
- for(int i = 18;i >= 0;i--){
- if(!ancestor(k, up[a][i]))
- 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);
- while(cin >> a){
- if(a == -1)
- break;
- cin >> b;
- if(a == b){
- cout << 0;
- continue;
- }
- int k = LCA(a, b);
- cout << max(Maks(a, k), Maks(b, k)) << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement