#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define N 500005
int fa[N],d[N];
vector <int> e[N];
void add(int u,int v){e[u].push_back(v);e[v].push_back(u);}
void dfs(int x,int f)
{
fa[x] = f;
d[x] = d[f]+1;
int size = e[x].size();
for(int i = 0;i < size;++i)
if(e[x][i] != f)
dfs(e[x][i],x);
}
int LCA(int x,int y)
{
while(d[x] > d[y]) x = fa[x];
while(d[y] > d[x]) y = fa[y];
while(x != y){x = fa[x];y = fa[y];}
return x;
}
inline int read()
{
int x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int main()
{
int n=read(),m=read(),rt=read();
for(int i = 1;i < n;++i)
add(read(),read());
dfs(rt,0);
while(m--)
printf("%d\n",LCA(read(),read()));
return 0;
}
按照老师教的板子写的,哪些地方还能优化吗?