绷不住了
#include <bits/stdc++.h>
using namespace std;
int n,m,s;
const int M = 500100;
int head[M],nxt[M],to[M],depth[M],cnt;
int f[M][26];
void add(int f,int t){
to[++cnt] = t;
nxt[cnt] = head[f];
head[f] = cnt;
}
void init(int now=s, int fa=0){ //now表示当前节点,fa表示其父亲节点
f[now][0] = fa; depth[now]=depth[fa]+1;
for(int i=1;(1<<i)<=depth[now];i++){
f[now][i] = f[f[now][i-1]][i-1];
}
for(int i=head[now];i!=-1;i=nxt[i]){
if(to[i]!=fa)init(to[i],now);
}
}
int lca(int a,int b){
if(depth[a]<depth[b])swap(a,b);
for(int i=20;i>=0;i--)
if(depth[f[a][i]]>=depth[b])a = f[a][i]; //还没到就上跳
if(a==b)return a;
for(int k=20;k>=0;k--){
if(f[a][k]!=f[b][k]){
a= f[a][k];
b= f[b][k];
}
}
return f[a][0];
}
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m>>s;
for(int i=1;i<=n-1;i++){
int f,t;
cin>>f>>t;
add(f,t);
add(t,f);
}
init();
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
cout<<lca(a,b)<<endl;
}
}