int n; vector<int> E[N]; int p[N]; int siz[N]; // 固定根时的子树大小 int hson[N]; // 重儿子 int ctr[N]; voiddfs(int u, int p = 0){ siz[u] = 1; p[u] = p; hson[u] = 0; for (auto& v : E[u]) { if (v == p) continue; dfs(v, u); siz[u] += siz[v]; if (siz[hson[u]] < siz[v]) hson[u] = v; }
if (siz[hson[u]] * 2 >= siz[u]) { int v = ctr[hson[u]]; while (siz[v] * 2 <= siz[u]) v = p[v]; ctr[u] = v; } else { ctr[u] = u; } }
voideachT(){ n = read(); for (int i = 2; i <= n; i++) { int u = read(), v = read(); E[u].push_back(v), E[v].push_back(u); } dfs(1); for (int u = 1; u <= n; u++) printf("%d\n", ctr[u]); }
for (int i = 0; i < n; i++) { int l, r; cin >> l >> r; l--, r--; if (l != -1) E[i].push_back(l), E[l].push_back(i); if (r != -1) E[i].push_back(r), E[r].push_back(i); }
int s = 0; while (1) { vector<int> siz(n), mss(n); auto dfs = [&](auto&& dfs, int u, int p) -> void { siz[u] = 1; for (auto v : E[u]) { if (v == p) continue; dfs(dfs, v, u); siz[u] += siz[v]; mss[u] = max(mss[u], siz[v]); } }; dfs(dfs, s, -1);
int ctr; int tot = siz[s]; for (int u = 0; u < n; u++) { mss[u] = max(mss[u], tot - siz[u]); if (siz[u] && mss[u] <= tot / 2) ctr = u; }
if (E[ctr].empty()) { answer(ctr); break; } elseif (E[ctr].size() == 1) { int u = ctr, v = E[ctr][0]; int x = query(u, v); if (x == 0) { // d(u) < d(v) answer(u); break; } else { // d(u) > d(v) answer(v); break; } } else { sort(E[ctr].begin(), E[ctr].end(), [&](constint u, constint v) { return mss[u] < mss[v]; });
int u = E[ctr][0], v = E[ctr][1]; int x = query(u, v); if (x == 0) { // d(u) < d(v) s = u; E[s].erase(find(E[s].begin(), E[s].end(), ctr)); } elseif (x == 2) { // d(u) > d(v) s = v; E[s].erase(find(E[s].begin(), E[s].end(), ctr)); } else { // d(u) == d(v) s = ctr; E[s].erase(E[s].begin()); E[s].erase(E[s].begin()); } } } }