#include<stdio.h>
#define MAXLOG 20
#define MAXN 500000
int f[MAXN][MAXLOG],dep[MAXN];
int queue[MAXN],m;
int next[MAXN*2],to[MAXN*2],head[MAXN];
char vis[MAXN];
void swap(int *p,int *q)
{
int r=*p;
*p=*q;
*q=r;
}
int lca(int x,int y)
{
if(dep[x]<dep[y])
{
swap(&x,&y);
}
int i;
for(i=MAXLOG-1;i>=0;--i)
{
if(dep[f[x][i]]>=dep[y])
{
x=f[x][i];
}
}
if(x==y)
{
return x;
}
for(i=MAXLOG-1;i>=0;--i)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
void init(int s)
{
int i,j,h=-1,t=0;
queue[0]=s;
vis[s]=1;
dep[s]=1;
while(h<t)
{
h++;
for(i=head[queue[h]];i!=-1;i=next[i])
{
if(vis[to[i]]==0)
{
vis[to[i]]=1;
t++;
queue[t]=to[i];
dep[to[i]]=dep[queue[h]]+1;
f[to[i]][0]=queue[h];
for(j=1;j<MAXLOG;++j)
{
f[to[i]][j]=f[f[to[i]][j-1]][j-1];
}
}
}
}
}
void asso(int r,int t)
{
next[m]=head[r];
to[m]=t;
head[r]=m;
m++;
}
int main()
{
int n,m,s,i,j,r,t;
scanf("%d%d%d",&n,&m,&s);
for(i=0;i<n;++i)
{
head[i]=-1;
for(j=0;j<MAXLOG;++j)
{
f[i][j]=-1;
}
}
for(i=0;i<n-1;++i)
{
scanf("%d%d",&r,&t);
asso(r-1,t-1);
asso(t-1,r-1);
}
init(s-1);
for(i=0;i<m;++i)
{
scanf("%d%d",&r,&t);
printf("%d\n",lca(r-1,t-1)+1);
}
return 0;
}
记录