#include<bits/stdc++.h>
using namespace std;
#define re register
int n,m,s,num1,num2,head[500001],tot,fa[500010][22],dep[500001],lg[22];
struct node{
int next,to;
}edge[1000010];
inline void addedge(int u,int v){
edge[++tot].next=head[u];
edge[tot].to=v;
head[u]=tot;
}
void dfs(int now,int fat){
fa[now][0]=fat;dep[now]=dep[fat]+1;
// printf("%d\n",fa[now][0]);
for(re int i=1;i<=lg[dep[now]];++i){
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(re int i=head[now];i;i=edge[i].next){
// if(edge[i].to==fat)continue;
if(edge[i].to!=fat)
dfs(edge[i].to,now);
}
}
inline int find(int x,int y){
if(dep[y]>dep[x]){
swap(x,y);
}
while(dep[x]>dep[y]){
x=fa[x][lg[dep[x]-dep[y]]-1];
}
if(x==y){
return x;
}
for(re int i=lg[dep[x]]-1;i>=0;--i){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];y=fa[y][i];
}
}
// printf("%d\n",x);
return fa[x][0];
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(re int i=1;i<=n-1;++i){
scanf("%d%d",&num1,&num2);
addedge(num1,num2);
addedge(num2,num1);
}
for(re int i=1;i<=n;++i){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
// if(i==1<<lg[i-1])++lg[i];
}
dfs(s,0);
while(m--){
scanf("%d%d",&num1,&num2);
printf("%d\n",find(num1,num2));
}
return 0;
}
交了好多次了,一直是30pts
有的点re
有的wa
有的tle