样例过了10分WA求调
#include<bits/stdc++.h>
using namespace std;
const int MAXN=500005;
struct Edge{
int to;
int next;
}e[2*MAXN];
int head[MAXN],edtot;
int n,m,s,u,v;
int deep[MAXN],f[MAXN][25];
void addedge(int u,int v){
edtot++;
e[edtot].to=v;
e[edtot].next=head[u];
head[u]=edtot;
}
void buildtree(int u,int n){
f[n][0]=u;
deep[n]=deep[u]+1;
for(int k=1;k<=24;k++)
f[n][k]=f[f[n][k-1]][k-1];
int i=head[n];
while(i){
if(e[i].to!=u) buildtree(n,e[i].to);
i=e[i].next;
}
return;
}
int lca(int x,int y){
if(deep[x]>deep[y]){
swap(x,y);
}
for(int k=24;k>=0;k--){
if(deep[x]==deep[y])
break;
if((1<<k)<=(deep[y]-deep[x])){
x=f[x][k];
}
}
for(int k=24;k>=0;k--)
{
if(f[x][k]!=f[y][k]){
x=f[x][k];
y=f[y][k];
}
}
return f[x][0];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>s;
for(int i=1;i<n;i++){
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
buildtree(s,s);
for(int i=1;i<=m;i++){
cin>>u>>v;
if(u==v) cout<<u<<endl;
else cout<<lca(u,v)<<endl;
}
return 0;
}