调了一个多小时,发现fa[1][]的值居然能影响fa[2][]的值??帮帮孩子吧...
#include<cstdio>
#include<iostream>
using namespace std;
const int N=10+5;
int n,m,s,p[N],dep[N],fa[N][20];
struct node{
int v,nt;
}E[N<<1];
inline void add(int u,int v){
E[++p[0]].v=v;
E[p[0]].nt=p[u];
p[u]=p[0];
}
void dfs1(int u,int f){
// printf("u:%d f:%d\n",u,f);
dep[u]=dep[f]+1;
for(int i=0;i<=19;i++){
fa[u][i+1]=fa[fa[u][i]][i];
}
for(int i=p[u],v;i;i=E[i].nt){
if((v=E[i].v)!=f){
fa[v][0]=u;
// printf("%d %d\n",v,u);
dfs1(v,u);
}
}
}
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
// printf("dep:%d %d\nfa_0:%d %d\n",dep[x],dep[y],fa[x][0],fa[y][0]);
for(int i=20;i>=0;i--){
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
}
// printf("dep:%d %d\n",dep[x],dep[y]);
// printf("x:%d y:%d\n",x,y);
for(int i=20;i>=0;i--){
// printf("x:%d y:%d\n",x,y);
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(s,0);
while (m--){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",LCA(x,y));
LCA(x,y);
}
return 0;
}