#include <bits/stdc++.h> using namespace std; int n,tree[500005][21],deep[500005]; vector<int> v[500005]; void qin(int &aaa){ char c=getchar(); int ans=0; while(c<‘0‘||c>‘9‘)c=getchar(); while(c>=‘0‘&&c<=‘9‘)ans=ans*10+c-‘0‘,c=getchar(); aaa=ans; } void qout(int aaa){ char s[11]; int n=0; while(aaa>0){ s[++n]=aaa%10+‘0‘; aaa/=10; } for(int i=n;i>=1;i--)putchar(s[i]); putchar(‘\n‘); } void dfs(int now,int l){ for(int i=0;i<v[now].size();i++) if(v[now][i]!=l){ tree[v[now][i]][0]=now; deep[v[now][i]]=deep[now]+1; dfs(v[now][i],now); } } void inti(){ for(int i=1;i<=19;i++) for(int j=1;j<=n;j++) tree[j][i]=tree[tree[j][i-1]][i-1]; } int LCA(int a,int b){ if(deep[a]<deep[b])swap(a,b); int c=deep[a]-deep[b],ii=0;; while(c>0){ if(c&1)a=tree[a][ii]; c>>=1; ii++; } if(a==b)return a; for(int i=19;~i;i--) if(tree[a][i]!=tree[b][i])a=tree[a][i],b=tree[b][i]; return tree[a][0]; } int main(){ int m,s; qin(n);qin(m);qin(s); for(int i=1;i<n;i++){ int a,b; qin(a);qin(b); v[a].push_back(b); v[b].push_back(a); } dfs(s,0); inti(); for(int i=1;i<=m;i++){ int aa,ab; qin(aa); qin(ab); qout(LCA(aa,ab)); } return 0; }
时间: 2024-10-01 03:44:38