不知道是什么特性,求助;w;
#include<cstdio>
using namespace std;
const int N = 5e5+10;
struct line{
int u,v,nxt;
line(int u=0,int v=0,int nxt=0):u(u),v(v),nxt(nxt){} //要初始化
};
line e[N<<1];
int cnt, head[N];
inline void addline(int u, int v){
e[++cnt] = line(u,v,head[u]), head[u] = cnt;
}
int n,m,s;
int fa[N][20], dep[N];
inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
int num,c,f=1;
for(;!(c=getchar());f=c);
for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
return f^45?num:-num;
}
inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
void build(int x){
for(int i=head[x];i;i=e[i].nxt){
int y = e[i].v;
if(fa[x][0]==y) continue;
fa[y][0] = x;
dep[y] = dep[x] + 1;
// printf("%d %d\n",y,fa[y][0]);
build(y);
}
}
int main(){
n=read(),m=read(),s=read();
for(int i=1;i<=n-1;i++){
int a=read(), b=read();
addline(a,b); addline(b,a);
}
// printf("\n");
build(s);
for(int j=1;j<=19;j++){
for(int i=1;i<=n;i++){
fa[i][j] = fa[fa[i][j-1]][j-1];
// printf("%d %d %d\n",i,j,fa[i][j]);
}
// printf("\n");
}
while(m--){
int a=read(), b=read();
if(dep[a] < dep[b]) swap(a,b);
int delta = dep[a] - dep[b];
// printf("Delta: %d\n",delta);
for(int i=19;i>=0;i--)
if(delta & (1<<i)) a = fa[a][i];
// printf("\n");
if(a == b){
printf("%d\n",a);
continue;
}
for(int i=19;i>=0;i--){
if(!fa[a][i] && !fa[b][i] && fa[a][i] != fa[b][i])
a = fa[a][i], b = fa[b][i];
}
printf("%d\n",fa[a][0]);
}
return 0;
}