如题,记录,请问大佬们咋办啊?
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 500005
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int d[N],fa[18][N],head[N],nxt[N],to[N];
int n,m,root,num=1;
void adde(int u,int v){
to[num]=v;
nxt[num]=head[u];
head[u]=num;
++num;
}
void dfs(int x){
int i=0;
for(i=head[x];i;i=nxt[i]){
int v=to[i];
if(v==fa[0][x])continue;
d[v]=d[x]+1;
fa[0][v]=x;
dfs(v);
}
}
void build(){
for(int j=1;j<=17;j++)
for(int i=1;i<=n;i++){
fa[j][i]=fa[j-1][fa[j-1][i]];
}
}
int solve(int u,int v){
int i;
if(d[u]<d[v])swap(u,v);
int temp=d[u]-d[v];
for(i=17;i>=0;i--)if(temp>=(1<<i))v=fa[i][u];
for(i=17;i>=0;i--){
if(fa[i][v]!=fa[i][u])v=fa[i][v],u=fa[i][u];
}
return fa[0][v];
}
int main(){
memset(head,-1,sizeof(head));
n=read();
m=read();
root=read();
for(int i=1;i<=n-1;i++){
int u,v;
u=read();
v=read();
adde(u,v);
adde(v,u);
}
fa[0][root]=root;
d[root]=1;
dfs(root);
build();
int u,v;
for(int i=1;i<=m;i++){
u=read();
v=read();
int ans=solve(u,v);
printf("%d\n",ans);
}
return 0;
}