RT,小编十分疑惑
求大佬帮忙看看code:
#include<iostream>
#include<cstdio>
using namespace std;
int n,q,m,s;
int u[1000005],v[1000005],before[1000005],now[1000005];
int anc[1000005][21],depth[1000005];
int lg[1000005];
int k=0;
void add(int x,int y,int i){
u[i]=x,v[i]=y;
before[i]=now[u[i]];
now[u[i]]=i;
}
void pre(int x,int fa){
anc[x][0]=fa,depth[x]=depth[fa]+1;
for(int i=1;i<=lg[depth[x]];i++)
anc[x][i]=anc[anc[x][i-1]][i-1];
for(int i=now[x];i!=-1;i=before[i])
if(v[i]!=fa)
pre(v[i],x);
return;
}
int lca(int x,int y){
if(depth[x]<depth[y])
swap(x,y);
//cout<<x<<" "<<depth[x]<<endl;
//cout<<y<<" "<<depth[y]<<endl;
while(depth[x]>depth[y])
x=anc[x][lg[depth[x]-depth[y]]-1];
for(int i=lg[depth[x]];i>=0;i--)
if(anc[x][i]!=anc[y][i])
x=anc[x][i],y=anc[y][i];
return anc[x][0];
}
int main(){
cin>>n>>q>>s;
m=n-1;
for(int i=1;i<=n;i++)
now[i]=-1;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
add(x,y,++k);
add(y,x,++k);
}
lg[0]=0;
for(int i=1;i<=n;i++)
lg[i]=lg[i>>1]+1;
pre(s,s);
while(q--){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}