#include #include #include #include int n; std::vector> graph; std::vector cut_mark; int get_size(int v, int p) { int s = 1; for (int u : graph[v]) { if (u == p || cut_mark[u]) { continue; } s += get_size(u, v); } return s; } std::pair find_centroid(int v, int p, int total) { int s = 1; for (int u : graph[v]) { if (u == p || cut_mark[u]) { continue; } auto [cs, c] = find_centroid(u, v, total); if (c != -1) { return {0, c}; } s += cs; } if (total - s <= total / 2) { return {0, v}; } return {s, -1}; } std::vector>> c_dist; void set_dist(int v, int p, int c, int d) { c_dist[v].emplace_back(c, d); for (int u : graph[v]) { if (u == p || cut_mark[u]) { continue; } set_dist(u, v, c, d + 1); } } void decompose(int v) { int total = get_size(v, -1); auto [_, c] = find_centroid(v, -1, total); cut_mark[c] = true; set_dist(c, -1, c, 0); for (int u : graph[c]) { if (cut_mark[u]) { continue; } decompose(u); } } int main() { scanf("%d", &n); graph.resize(n); cut_mark.resize(n, false); c_dist.resize(n); for (int i = 0; i < n - 1; ++i) { int u, v; scanf("%d %d", &u, &v); --u; --v; graph[u].push_back(v); graph[v].push_back(u); } decompose(0); std::vector> black_pq(n); std::vector color(n, 0); int q; scanf("%d", &q); for (int i = 0; i < q; ++i) { int t, v; scanf("%d %d", &t, &v); --v; if (t == 1) { if (color[v] == 0) { for (const auto& [c, d] : c_dist[v]) { black_pq[c].insert(d); } } else { for (const auto& [c, d] : c_dist[v]) { black_pq[c].erase(black_pq[c].find(d)); } } color[v] = 1 - color[v]; } else { int ans = n; for (const auto& [c, d] : c_dist[v]) { if (!black_pq[c].empty()) { ans = std::min(ans, d + *black_pq[c].begin()); } } printf("%d\n", ans); } } }