#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <utility>
#include <tuple>
#include <string>
#include <algorithm>
#include <numeric>
#define boost ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define Endl puts("")
#define bug puts("CSP rp++!!!")
using namespace std;
typedef long long ll;
typedef double dbl;
const int maxn = 5e5+5;
struct Q{
int to, no;
Q(){}
Q(int to, int no): to(to), no(no){}
};
int n, m, r;
list<int> g[maxn];
list<Q> q[maxn];
int ds[maxn];
bool vis[maxn];
int ans[maxn];
int seek(int x){
return ds[x] == x ? x : ds[x] = seek(ds[x]);
}
void unite(int x, int y){
x = seek(x); y = seek(y);
if (x == y) return;
ds[x] = y;
}
void tarjan(int v){
vis[v] = 1;
for (int t : g[v]){
if (vis[t]) continue;
tarjan(t);
unite(t, v);
}
for (Q t : q[v]){
if (!vis[t.to]) continue;
ans[t.no] = ans[t.no ^ 1] = seek(t.to);
}
}
int main(){
scanf("%d %d %d", &n, &m, &r);
r--;
for (int i = 0; i < n; i++) ds[i] = i;
for (int i = 0; i < n - 1; i++){
int u, v; scanf("%d %d", &u, &v);
u--; v--;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 0; i < m; i++){
int u, v; scanf("%d %d", &u, &v);
u--; v--;
q[u].push_back(Q(v, i << 1));
q[v].push_back(Q(u, i << 1 | 1));
}
tarjan(r);
for (int i = 0; i < m; i++) printf("%d\n", ans[i << 1] + 1);
return 0;
}
第一行全过了,从第二行开始非常玄的挂了 WA,啾啾我~~