Subtask #1 第三个点 WA
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
#define int long long
#define MAXN 500001
#define MAXM 2*500001
#define INF 0x7fffffff
struct node{int val,pos;};
vector<int> g[MAXN];
vector<node> G[MAXN];
int n,m,s,ans[MAXM],vis[MAXM],fa[MAXM];
int find(int x){
if(x == fa[x])return x;
else return fa[x] = find(fa[x]);
}
void tarjan(int u){
vis[u] = 1;
int len = g[u].size();
for(int i = 0;i < len;++i){
int v = g[u][i];
if(!vis[v]){
tarjan(v);
fa[v] = u;
}
}
int lenn = G[u].size();
for(int i = 0;i < lenn;++i){
int v = G[u][i].val,p = G[u][i].pos;
if(vis[v] == 2){
ans[p] = find(v);
}
}
vis[u] = 2;
return ;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s;
for(int i = 1;i < n;++i){
int x,y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
fa[i] = i;
}
fa[n] = n;
for(int i = 1;i <= m;++i){
int q1,q2;
cin >> q1 >> q2;
G[q1].push_back({q2,i});
G[q2].push_back({q1,i});
}
tarjan(s);
for(int i = 1;i <= m;++i){
cout << ans[i] << endl;
}
return 0;
}