#includebits/stdc++.hstruct node{ int from,to,next;}edge[1000001];int n,m,s,head[1000001],num,depth[1000001],father[1000001][50];void add(int u,int v){ edge[++num].from=u; edge[num].to=v; edge[num].next=head[u]; head[u]=num; return;}void De
#include<bits/stdc++.h> struct node { int from,to,next; }edge[1000001]; int n,m,s,head[1000001],num,depth[1000001],father[1000001][50]; void add(int u,int v) { edge[++num].from=u; edge[num].to=v; edge[num].next=head[u]; head[u]=num; return; } void Depth_First_Search(int now,int dep,int last) { for(int i=head[now];i;i=edge[i].next) if(edge[i].to-last) { depth[edge[i].to]=dep+1; father[edge[i].to][0]=now; for(int j=1;(1<<j)<=depth[edge[i].to];j++) father[edge[i].to][j]=father[father[edge[i].to][j-1]][j-1]; Depth_First_Search(edge[i].to,dep+1,now); } return; } int lca(int x,int y) { if(depth[x]<depth[y]) x^=y^=x^=y; while(depth[x]>depth[y]) x=father[x][int(log2(depth[x]-depth[y]))]; if(x==y) return x; for(int i=log2(depth[x]);i>=0;i--) if(father[x][i]-father[y][i]) { x=father[x][i]; y=father[y][i]; } return father[x][0]; } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n-1;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } Depth_First_Search(s,0,0); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); printf("%d\n",lca(x,y)); } return 0; }