貌似是dfs出了问题(调了好几天了) code:
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
int to,next;
}e[500001];
int n,m,s;
int dep[500001],head[500001],fa[500001][21],tot=0;
void add(int u,int v)
{
e[++tot].to=v;
e[tot].next=head[u];
head[u]=tot;
}
void dfs(int p,int f)
{
if (p==0) return;
dep[p]=dep[f]+1;
fa[p][0]=f;
for (int i=1;(1<<i)<=dep[p];i++) fa[p][i]=fa[fa[p][i-1]][i-1];
for (int i=head[p];i;i=e[i].next) if(e[i].to!=f) dfs(e[i].to,p);
}
int lca(int x,int y)
{
if (dep[y]<dep[x]) swap(x,y);
int t=20;
while (dep[x]<dep[y])
{
if (dep[x]+(1<<t)<=dep[y])
x=fa[x][t];
t--;
}
if (x==y) return y;
for (int i=20;i>=0;--i)
{
if (fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main()
{
cin>>n>>m>>s;
for (int i=1;i<=n-1;++i)
{
int u,v;cin>>u>>v;
add(u,v);
add(v,u);
}
dfs(s,0);
for (int i=1;i<=m;++i)
{
int x,y;cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}