Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- const int MAXN = 1e5+100;
- #define lp(i,a,b) for(int i=a;i<b;i++)
- #define mk make_pair
- #define pb push_back
- #define LOG 20
- #define ff first
- #define ss second
- using namespace std;
- typedef pair<int,int> pii;
- int N,K, pai[MAXN], nivel[MAXN];
- int resp, resp_dois;
- vector<pii> adj[MAXN];
- int dp2[MAXN][LOG], dp3[MAXN][LOG], dp[MAXN][LOG];
- void ini()
- {
- // memset(dp, -1, sizeof dp);
- lp(i,0,MAXN) dp[i][0]=pai[i];
- lp(j,1,LOG)
- lp(i,1,N+1)
- // if(dp[i][j-1]!=-1)
- dp[i][j] = dp[dp[i][j-1]][j-1];
- // lp(i,1,N+1)
- lp(j,1,LOG)
- lp(i,1,N+1)
- {
- if(dp[i][j-1] == -1) {
- dp2[i][j] = dp2[i][j-1];
- dp3[i][j] = dp3[i][j-1];
- } else {
- dp2[i][j] = min(dp2[i][j-1], dp2[dp[i][j-1]][j-1]);
- dp3[i][j] = max(dp3[i][j-1], dp3[dp[i][j-1]][j-1]);
- }
- }
- }
- int LCA(int a, int b)
- {
- // printf("1 RESP=%d\n", resp);
- //assumindo que b está mais abaixo na arvore que a
- if (nivel[a]>nivel[b]) swap(a,b);
- //agora preciso nivelá-los
- for(int i=LOG-1;i>=0;i--)
- if(nivel[b]-(1<<i)>=nivel[a]){
- resp=min(resp, dp2[b][i]);
- // printf("2 RESP=%d i=%d b=%d\n", resp, i, b);
- resp_dois=max(resp_dois, dp3[b][i]);
- b = dp[b][i];
- }
- if(a==b) return a;
- for(int i=LOG-1;i>=0;i--)
- {
- if(dp[a][i]!=-1 and dp[a][i]!=dp[b][i])
- {
- resp_dois=max(resp_dois, dp3[a][i]);
- resp_dois=max(resp_dois, dp3[b][i]);
- resp=min(resp, dp2[a][i]);
- resp=min(resp, dp2[b][i]);
- // printf("3 RESP=%d\n", resp);
- a = dp[a][i];
- b = dp[b][i];
- }
- }
- resp_dois=max(dp3[a][0], resp_dois);
- resp_dois=max(dp3[b][0], resp_dois);
- resp=min(dp2[a][0], resp);
- resp=min(dp2[b][0], resp);
- // printf("4 RESP=%d\n", resp);
- return pai[a];
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cin>>N;
- lp(i,0,N-1)
- {
- int c,a,b;
- cin>>a>>b>>c;
- adj[a].pb(mk(b,c));
- adj[b].pb(mk(a,c));
- }
- queue<int> fila;
- fila.push(1);
- // pai[1]=-1;
- pai[1]=1;
- nivel[1] = 0;
- dp2[1][0] = 0x3f3f3f3f; //min
- dp3[1][0] = 0; //max
- while(!fila.empty())
- {
- int topo = fila.front();
- fila.pop();
- lp(i,0,adj[topo].size())
- {
- int v = adj[topo][i].first;
- if(v!=pai[topo]){
- pai[v] = topo;
- nivel[v]=nivel[topo]+1;
- dp2[v][0] = dp3[v][0] =adj[topo][i].ss;
- fila.push(v);
- }
- }
- }
- // printf("dp2 3 0 = %d\n", dp2[3][0]);
- ini();
- cin>>K;
- while(K--)
- {
- int a,b, lca;
- cin>>a>>b;
- resp=0x3f3f3f3f;
- resp_dois=-1;
- if(a==b)
- {
- cout<<"0 0"<<endl;
- continue;
- }
- lca = LCA(a,b);
- cout<<resp<<" "<<resp_dois<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement