#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000000;
struct node{
int to,nxt;
}edge[2*N+5];
int n,t,root,head[N+5],cnt,depth[N+5],fa[N+5][20];
void add(int u,int v){
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int now,int fath){
depth[now]=depth[fath]+1,fa[now][0]=fath;
for (int i=1;i<=log2(depth[now])+1;i++)//
fa[now][i]=fa[fa[now][i-1]][i-1];
for (int i=head[now];i;i=edge[i].nxt)
if (edge[i].to!=fath) dfs(edge[i].to,now);
}
int LCA(int u,int v){
if (depth[u]<depth[v]) swap(u,v);
for (int i=20;i>=0;i--)
if (depth[v]<=depth[u]-(1<<i)) u=fa[u][i];
if (u==v) return u;
for (int i=20;i>=0;i--)
if (fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
void test(int k,int fath){
cout<<k<<' ';
for (int i=head[k];i;i=edge[i].nxt)
if (edge[i].to!=fath) test(edge[i].to,k);
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>t>>root;
for (int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
add(u,v),add(v,u);
}
// test(root,0);cout<<'\n';
dfs(root,0);
while (t--){
int u,v;
cin>>u>>v;
cout<<LCA(u,v)<<'\n';
}
return 0;
}
样例未过,有些输出0