#include <bits/stdc++.h>
usingnamespacestd;constintsz=17;//(1<<sz)>=n이 되게 관리.vector<int>tree[1<<sz];intdepth[1<<sz];//depth[i] : i번 노드의 깊이(루트노드에서부터의 거리)intsparse[1<<sz][sz];//sparse[i][j] : i번째 노드의 2^j번째 부모. 1번(루트)노드의 부모도 1이라고 가정.voidgo(intnode,intd,intparent){sparse[node][0]=parent;depth[node]=d;//어떤 노드의 2^i번째 부모는, 그 노드의 2^(i-1)번째 부모의 2^(i-1)번째 부모임.for(inti=1;i<sz;i++)sparse[node][i]=sparse[sparse[node][i-1]][i-1];for(intto:tree[node])if(parent!=to)go(to,d+1,node);}intLCA(inta,intb){if(depth[a]>depth[b])swap(a,b);//b가 더 깊은 점.for(inti=sz-1;i>=0;i--)//b를 a 높이까지 올려줌.if(depth[sparse[b][i]]>=depth[a])b=sparse[b][i];if(a==b)returna;//a,b가 같은 점이면 그 점이 LCA.for(inti=sz-1;i>=0;i--)if(sparse[a][i]!=sparse[b][i])a=sparse[a][i],b=sparse[b][i];returnsparse[a][0];//a,b의 한단계 위가 LCA.}intmain(){intn,m;scanf("%d",&n);for(inti=1;i<n;i++){inta,b;scanf("%d %d",&a,&b);tree[a].push_back(b);tree[b].push_back(a);}go(1,0,1);scanf("%d",&m);while(m--){inta,b;scanf("%d %d",&a,&b);printf("%d\n",LCA(a,b));}return0;}