#include<bits/stdc++.h>
using namespace std;
int dep[10000000],fat[100000][22],lg[1000000];
struct Node{
int to,net;
}e[1000000];
int cnt,head[600000];
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].net=head[u];
head[u]=cnt;
}
void dfs(int u,int fa)
{
fat[u][0]=fa;
dep[u]=dep[fa]+1;
for(int i=1;i<=lg[dep[u]];i++)
fat[u][i]=fat[fat[u][i-1]][i-1];
for(int i=head[u];i;i=e[i].net)
{
int b=e[i].to;
if(b==fa)continue;
dfs(b,u);
}
}
int lca(int x,int y){
if(dep[y]>dep[x])
swap(x,y);
while(dep[x]>dep[y])
{
x=fat[x][lg[dep[x]-dep[y]]-1];
}
if(x==y)return x;
for(int i=lg[x]-1;i>=0;i--)
if(fat[x][i]!=fat[y][i])
x=fat[x][i],y=fat[y][i];
return fat[x][0];
}
int main(){
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++)
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
dfs(s,0);
for(int i=1;i<=m;i++)
{
int c,b;
scanf("%d%d",&c,&b);
printf("%d\n",lca(b,c));
}
return 0;
## }```c
```