Wonderful Answer
#include<bits/stdc++.h>
using namespace std;
struct A{
int x,y;
}tree[1000001];
int n,m,s;
int d[100001],p[200001],top,nxt[100001];
void dfs(int now,int deep){
d[now]=deep;
top++;
p[top]=now;
nxt[now]=top;
for(int i=1;i<n;i++){
if(tree[i].x==now&&d[tree[i].y]==0){
dfs(tree[i].y,deep+1);
}
if(tree[i].y==now&&d[tree[i].x]==0){
dfs(tree[i].x,deep+1);
}
}
}
int find(int a,int b){
int ai=0,bi=0;
for(int i=1;i<=top;i++){
if(p[i]==a){
ai=i;
}
if(p[i]==b){
bi=i;
}
if(ai!=0&&bi!=0){
break;
}
}
int sum=0,ans=INT_MAX;
for(int i=min(ai,bi);i<=max(ai,bi);i++){
if(ans>d[i]){
d[i]=ans;
sum=p[i];
}
}
return sum;
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<n;i++){
cin>>tree[i].x>>tree[i].y;
}
dfs(s,1);
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
cout<<find(a,b)<<endl;
}
return 0;
}