点击查看折叠代码块
/*
LCA(最近公共祖先)模板
倍增LCA
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int fa[maxn][30];
int n,m,s;
int head[maxn],cnt=0;
int dep[maxn];
struct node{
int v,next;
}e[maxn<<1];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int u,int f){
dep[u]=dep[f]+1;
fa[u][0]=f;
for (int i=1;(1<<i)<=dep[u];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for (int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v!=f) dfs(v,u);
}
}
int lca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
for (int i=25;i>=0;i--){
int d=dep[a]-dep[b];
if(d>=(1<<i)) a=fa[a][i];
}
if(a==b) return a;
for (int i=25;i>=0;i--){
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];
b=fa[b][i];
}
}
return fa[a][0];
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for (int i=1;i<=n-1;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs(s,0);
for (int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
int ans=lca(u,v);
printf("%d\n",ans);
}
return 0;
}