rendered paste body#include<iostream>using namespace std;int T[400001],P[400001][10],N,father,child,number,p,q,L[400001];void process3(){ int i, j; for (i = 0; i <=N; i++) for (j = 0; 1 << j < N; j++) P[i][j] = -1; for (i = 0; i <=N; i++) P[i][0] = T[i]; for (j = 1; 1 << j <=N; j++) for (i = 0; i <=N; i++) if (P[i][j - 1] != -1) P[i][j] = P[P[i][j - 1]][j - 1];}int query(){ int tmp, log, i; if (L[p] < L[q]) { tmp = p; p = q; q = tmp; } for (log = 1; 1 << log <= L[p]; log++); log--; for (i = log; i >= 0; i--) if (L[p] - (1 << i) >= L[q]) p = P[p][i]; if (p == q) return p; for (i = log; i >= 0; i--) { if (P[p][i] != -1 && P[p][i] != P[q][i]) { p = P[p][i]; q = P[q][i]; } } return T[p];}int main(){ scanf("%d",&N); pair<int ,int> level[N]; T[0]=0; L[0]=0; for(int i=0;i<N;i++) { scanf("%d",&child); scanf("%d",&father); T[child]=father; level[i]=make_pair(father,child); } sort(level,level+N); for(int i=0;i<N;i++) L[level[i].second]=L[level[i].first]+1; process3(); scanf("%d",&number); for(int i=0;i<number;i++) { scanf("%d",&p); scanf("%d",&q); cout<<query()<<endl; } }