70分RE!!!
#include<cstdio>
#include<cmath>
#define MAXN 500000+10000
#define MAXLOG 200
int ver[MAXN*2],next[MAXN*2],head[MAXN*2],tot,n,m,s;
inline void add(int x,int y){
ver[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
int de[MAXN],vis[MAXN],f[MAXN][MAXLOG];
inline void dfs(int i,int d,int father){
de[i]=d;
f[i][0]=father;
for(int j=1;j<=log2(d);j++)
f[i][j]=f[f[i][j-1]][j-1];
for(int j=head[i];j;j=next[j]){
if(!vis[ver[j]]){
vis[ver[j]]=1;
dfs(ver[j],d+1,i);
vis[ver[j]]=0;
}
}
}
inline int getlca(int x,int y){
if(x==y)return x;
if(de[x]>de[y]){
for(int i=log2(x);i>=0;i--){
if(f[x][i]!=0&&de[f[x][i]]>=de[y]){
return getlca(f[x][i],y);
}
}
}else if(de[x]<de[y]){
for(int i=log2(y);i>=0;i--){
if(f[y][i]!=0&&de[f[y][i]]>=de[x]){
return getlca(x,f[y][i]);
}
}
}else{
for(int i=0;i<=log2(x);i++){
if(f[x][i]==f[y][i]){
if(i!=0)return getlca(f[x][i-1],f[y][i-1]);
else return getlca(f[x][0],f[y][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);
}
vis[s]=1;
dfs(s,1,0);
vis[s]=0;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",getlca(x,y));
}
return 0;
}