样例过不了
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500000;
int n, m, s;
int tot, head[MAXN], to[MAXN], nxt[MAXN];
int dep[MAXN], f[MAXN][22];
void add(int x, int y)
{
nxt[++ tot] = head[x];
head[x] = tot;
to[tot] = y;
}
void init(int x, int fa)
{
dep[x] = dep[fa] + 1;
for (int i = 0 ; i <= 21 ; i ++)
{
f[x][i + 1] = f[f[x][i]][i];
}
for (int i = head[x] ; i ; i = nxt[i])
{
int y = to[i];
if (y == fa)
{
continue;
}
f[y][0] = x;
init(y, x);
}
}
int lca(int a, int b)
{
if (dep[a] < dep[b])
{
swap(a, b);
}
for (int i = 21 ; i >= 0 ; i --)
{
if (dep[f[a][i]] >= dep[b])
{
a = f[a][i];
}
}
if (a == b)
{
return a;
}
for (int i = 21 ; i >= 0 ; i --)
{
if (f[a][i] != f[b][i])
{
a = f[a][i];
b = f[b][i];
}
}
return f[a][0];
}
int main()
{
memset(head, -1, sizeof(head));
cin >> n >> m >> s;
for (int i = 1 ; i < n ; i ++)
{
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
init(s, 0);
while (m --)
{
int a, b;
cin >> a >> b;
cout << lca(a, b) << endl;
}
}