;#include<bits/stdc++.h> using namespace std; int n,r,q,dep[1000005],f[1000005][25],x,y,h[1000005],tot; struct node{ int n,t; }e[2000005]; void add(int x,int y){ tot++; e[tot].t=y; e[tot].n=h[x]; h[x]=tot; } void dfs(int x,int fa){ dep[x]=dep[fa]+1; for(int i=h[x];i!=-1;i=e[i].n){ if(e[i].t!=fa){ f[e[i].t][0]=x; dfs(e[i].t,x); } } } int lca(int x,int y){ if(dep[y]<dep[x])swap(x,y); int k=int(log2(dep[y]))+1; for(int i=k;i>=0;i--) if(dep[y]-(1<<i)>=dep[x]) y=f[y][i]; if(x==y)return x; for(int i=k;i>=0;i--){ if(f[x][i]!=-1&&f[x][i]!=f[y][i]){ x=f[x][i]; y=f[y][i]; } } return f[x][0]; } int main(){ cin>>n>>q>>r; memset(f,-1,sizeof f); memset(h,-1,sizeof h); for(int i=1;i<n;i++){ cin>>x>>y; add(x,y); add(y,x); } dfs(r,0); for(int j=1;(1<<j)<n;j++){ for(int i=1;i<=n;i++) if(f[i][j-1]!=-1) f[i][j]=f[f[i][j-1]][j-1]; } for(int i=1;i<=q;i++){ cin>>x>>y; cout<<lca(x,y)<<endl; } }
Note.ms
/2023jb404