rt,code:
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 5e5 + 20;
struct edge {
int to, nxt;
} g[maxn << 1];
int tot, head[maxn];
void add(int u, int to) {
g[++tot].to = to;
g[tot].nxt = head[u];
head[u] = tot;
}
int logs[maxn];
void logo() {
logs[1] = 0;
logs[2] = 1;
for (int i = 1; i <= maxn; i++) {
logs[i] = logs[i / 2] + 1;
}
}
int n, y, s;
int depth[maxn], fa[maxn][22];
void dfs(int fath, int now) {
fa[now][0] = fath;
depth[now] = depth[fath] + 1;
for (int i = 1; i <= logs[depth[now]]; i++) {
fa[now][i] = fa[fa[now][i - 1]][i - 1];
}
for (int i = head[now]; i; i = g[i].nxt) {
if (g[i].to != fath)
dfs(now, g[i].to);
}
}
int LCA(int x, int y) {
if (depth[x] < depth[y])
swap(x, y);
// cout << "...." << endl;
while (depth[x] > depth[y])
x = fa[x][logs[depth[x] - depth[y]]]; //, printf("%d\n", x);
// cout << "...." << endl;
if (x == y)
return x;
for (int k = logs[depth[x]]; k >= 0; k--) {
if (fa[x][k] != fa[y][k]) {
x = fa[x][k];
y = fa[y][k];
}
}
// cout << "...." << endl;
return fa[x][0];
}
int main() {
scanf("%d %d %d", &n, &y, &s);
int m = n - 1;
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
add(x, y);
add(y, x);
}
// cout << "input ok" << endl;
logo();
dfs(s, 0);
// cout << "pre process ok" << endl;
for (int i = 1; i <= y; i++) {
int x, y;
scanf("%d %d", &x, &y);
// cout << "????" << endl;
// cout << x << y << endl;
printf("%d\n", LCA(x, y));
// cout << "!!!!" << endl;
}
return 0;
}