样例输出
4
0
1
0
4
我们老师给我调样例调自闭了
求助万能谷民qwq
#include<iostream>
#define N 500005
using namespace std;
struct tree{
int v,next;
}t[N*2];
int n,m,s;
int cnt,h[N],d[N],p[N][20];
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void addedge(int u,int v){
t[++cnt].v=v;
t[cnt].next=h[u];
h[u]=cnt;
}
void dfs(int u,int fa){
d[u]=d[fa]+1;
p[u][0]=fa;
for(int i=1; (1<<(i-1))<=d[u];i++){
p[u][i]=p[p[u][i-1]][i-1];
}
for(int i=h[u];i;i=t[i].next){
if(t[i].v!=fa) dfs(t[i].v,u);
}
}
int lca(int u,int v){
if(d[u]<d[v]) swap(u,v);
for(int i=20;i>=0;i--){
if(d[p[u][i]]>=d[v]) u=p[u][i];
}
if(u==v) return u;
for(int i=20;i>=0;i--){
if(p[u][i]!=p[v][i]) u=p[u][i],v=p[v][i];
}
return p[u][0];
}
int main(){
cin>>n>>m>>s;
for(int i=1,u,v;i<n;i++){
u=read(),v=read();
addedge(u,v);
addedge(v,u);
}
dfs(s,0);
for(int i=1,u,v;i<=m;i++){
u=read(),v=read();
printf("%d\n",lca(u,v));
}
return 0;
}