#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int n, m, dep[100002], MAXK, parent[100002][20];
bool vis[100002];
vector<int> e[100002];
void makeTree(int here, int depth) { //트리 만들면서 첫번째 부모와 깊이를 채움
//if (vis[here]) return; //continue문 주석 풀고 여길 주석해도 똑같음
vis[here] = true;
dep[here] = depth;
for (int i = 0; i < e[here].size(); i++) {
int next = e[here][i];
if (vis[next]) continue;
parent[next][0] = here; //첫번째 부모 저장
makeTree(next, depth + 1);
}
}
void fillParent() { //바텀업으로 부모 배열 채워줌
for (int k = 1; k <= MAXK; k++)
for (int i = 1; i <= n; i++)
parent[i][k] = parent[parent[i][k - 1]][k - 1];
}
int lca(int swall, int deep) {
if (dep[deep] < dep[swall]) swap(deep, swall);
for (int k = MAXK; k >= 0; k--) { //높이를 동일하게 맞춰줌
int dif = dep[deep] - dep[swall];
if (dif >= (1 << k)) deep = parent[deep][k];
}
if (deep == swall)
return deep;
//printf("deep swall 중간 %d %d\n", deep, swall);
for (int k = MAXK; k >= 0; k--) {
if (parent[deep][k] != parent[swall][k]) {
deep = parent[deep][k];
swall = parent[swall][k];
}
}
return parent[deep][0];
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i < n-1; i++) { //node가 n개고 간선은 n-1개
int src, dst;
cin >> src >> dst;
e[src].push_back(dst);
e[dst].push_back(src);
}
makeTree(1, 0); //root = 1, root depth = 0
MAXK =(int)floor(log2(n)); //포함 -> 최대높이*****************
fillParent();
cin >> m;
while (m--) {
int a, b;
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}