#include<bits/stdc++.h>
#define M 514514
using namespace std;
int n,m,s,tot=0,nex[2*M],first[2*M],to[2*M],dep[M],f[M][21];
inline int read(){
int x=0;char c=getchar();
while(c<'0'||c>'9'){c=getchar();}
while(c>='0' and c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return x;
}
inline void add(int x,int y){
nex[++tot]=first[x];first[x]=tot;to[tot]=y;
nex[++tot]=first[y];first[y]=tot;to[tot]=x;
}
inline void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=1;i<=20;i++)
f[u][i]=f[f[u][i-1]][i-1];//递推
for(int e=first[u];e;e=nex[e]){
int v=to[e];
if(v==fa)continue;
f[v][0]=u;
dfs(v,u);
}
}
inline int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--){
if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
}
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main(){
n=read(),m=read(),s=read();
for(int i=1;i<=n-1;i++){
int x,y;
x=read(),y=read();
add(x,y);
}
dfs(s,0);
for(int i=1;i<=m;i++){
int a,b;
a=read(),b=read();
cout<<lca(a,b)<<'\n';
}
return 0;
}
倍增求最近公共祖先(LCA)
最新推荐文章于 2024-10-07 19:01:55 发布