求助有几个数据很大的点t了
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500005;
int n, m, s, cnt;
int dep[MAXN], fa[MAXN][32], nex[MAXN], hed[MAXN], e[MAXN*2];
void add(int a, int b){
e[++cnt] = b, nex[cnt] = hed[a], hed[a] = cnt;
e[++cnt] = a, nex[cnt] = hed[b], hed[b] = cnt;
}
void dfs(int k, int f){
dep[k] = dep[f]+1;
fa[k][0] = f;
for(int i=1; (1<<i)<=dep[k]; ++i)
fa[k][i] = fa[fa[k][i-1]][i-1];
for(int i=hed[k]; i; i=nex[i])
if(e[i]!=f)
dfs(e[i], k);
}
int lca(int x, int y){
if(dep[x]>dep[y])
swap(x, y);
for(int i=20; ~i; --i)
if(dep[y]-(1<<i)>=dep[x])
y = fa[y][i];
if(x==y)
return x;
for(int i=20; ~i; --i)
if(fa[x][i]!=fa[y][i])
x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int main(){
freopen("input.txt", "r", stdin);
scanf("%d%d%d", &n, &m, &s);
int a, b;
for(int i=1; i<n; ++i){
scanf("%d%d", &a, &b);
add(a, b);
}
dfs(s, 0);
while(m--){
scanf("%d%d", &a, &b);
printf("%d\n", lca(a, b));
}
return 0;
}