马蜂清奇,不要在意
#include<bits/stdc++.h>
#define ll long long
const int MAX=5e5;
using namespace std;
int maxx=-1e9;
inline int read()
{
char qwqc=getchar();
int qwqf=1,qwqx=0;
while(qwqc<'0'||qwqc>'9')
{
if(qwqc=='-') qwqf=-1;
qwqc=getchar();
}
while(qwqc>='0'&&qwqc<='9')
{
qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
qwqc=getchar();
}
return qwqf*qwqx;
}
inline void write(ll x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
vector<int> edge[MAX];
int deep[MAX],fa[MAX][20],bz[MAX];
int lg[20];
inline void dfs(int s)
{
int siz=edge[s].size();
for(int i=0;i<siz;i++)
{
if(bz[edge[s][i]]) continue;
fa[edge[s][i]][0]=s;
deep[edge[s][i]]=deep[s]+1;
for(int j=1;j<=lg[edge[s][i]];j++)
fa[edge[s][i]][j]=fa[fa[edge[s][i]][j-1]][j-1];
bz[edge[s][i]]=1;
dfs(edge[s][i]);
}
}
inline int lca(int x,int y)
{
if(deep[x]<deep[y]) {x^=y;y^=x;x^=y;}
while(deep[x]>deep[y]) x=fa[x][lg[deep[x]-deep[y]]];
if(x==y) return x;
for(int i=lg[deep[x]]-1;i>=0;i--)
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
return fa[x][0];
}
int main()
{
int n=read(),m=read(),s=read();
deep[s]=1;bz[s]=1;
for(int i=1;i<=n;i++)
lg[i]=log2(i);
for(int i=1;i<n;i++)
{
int x=read(),y=read();
edge[x].push_back(y);
edge[y].push_back(x);
}
dfs(s);
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
write(lca(x,y));
putchar('\n');
}
return 0;
}