#include <bits/stdc++.h>
using namespace std;
int n, m, s;
const int maxn = 5e6+1;
int fa[maxn][19];
int head[maxn];
int cnt = 0;
struct edge{
int u, v, nxt;
}edge[maxn];
void addedge(int u, int v) {
edge[cnt].v = v;
edge[cnt].nxt = head[u];
head[u] = cnt++;
}
int dep[maxn];
void init() {
for(int i =0; i< n; i++)
head[i] = -1;
for(int i = 0; i< m; i++)
edge[i].nxt = -1;
}
void dfs(int s, int fat) {
fa[s][0] = fat;
dep[s] = dep[fat] + 1;
for(int i = 1; (1 << i) <= dep[s] ; i++)
fa[s][i] = fa[fa[s][i-1]][i-1];
for(int i = head[s]; ~i; i = edge[i].nxt) {
if(edge[i].v != fat)
dfs(edge[i].v, s);
}
}
int lca(int x, int y) {
if(dep[x] < dep[y]) swap(x, y);
for(int i =19; i; i--) {
if(dep[x] + (1 << i) <= dep[y])
x = fa[x][i];
}
if(x == y) return x;
for(int i = 19;i; i--) {
if(fa[x][i] != fa[y][i]) {
x = fa[x][i], y = fa[y][i];
}
}
return fa[x][0];
}
int main() {
init();
memset(dep, 0, sizeof(dep));
int u, v;
cin >> n >> m >> s;
for(int i = 1; i<= n-1; i++) {
scanf("%d%d", &u, &v);
addedge(u, v); addedge(u, v);
}
dfs(s, s);
int a, b;
for(int i = 1;i <= m; i++) {
scanf("%d%d", &a, &b);
printf("%d\n", lca(a, b));
}
return 0;
}
读完便后就不动了,怎么回事???