总结
** 模板题,照着练练手,要开启O2优化,不然TLE**
const int N=5e5+5;
int h[N],dp[N][21];
vector<int>G[N];
void dfs(int x)
{
for(int i=0;i<G[x].size();i++)
{
int v=G[x][i];
if(v==dp[x][0])
continue;
h[v]=h[x]+1;
dp[v][0]=x;
dfs(v);
}
}
int lca(int x,int y)
{
if(h[x]<h[y])
swap(x,y);
for(int i=20;i>=0;i--)
if(h[x]-h[y]>>i)
x=dp[x][i];
if(x==y)
return x;
for(int i=20;i>=0;i--)
if(dp[x][i]!=dp[y][i])
x=dp[x][i],y=dp[y][i];
return dp[x][0];
}
signed main()
{
IOS;
file();
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
G[x].pb(y);
G[y].pb(x);
}
dfs(k);
for(int i=1;i<=20;i++)
{
for(int j=1;j<=n;j++)
dp[j][i]=dp[ dp[j][i-1] ][i-1];
}
while(m--)
{
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}