#include #include #include using namespace std; #include using namespace atcoder; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector> g(n); for(int i = 0; i < n - 1; i++){ int u, v; cin >> u >> v; u--; v--; g[u].emplace_back(v); g[v].emplace_back(u); } vector par(n, -1); vector sub(n, 0); vector dep(n, 0); auto dfs = [&](auto& dfs, int now) -> void { for(int nxt: g[now]){ if(nxt == par[now]) continue; par[nxt] = now; dep[nxt] = dep[now] + 1; dfs(dfs, nxt); sub[now] += sub[nxt]; } sub[now]++; return; }; dfs(dfs, 0); vector> paths = {{}}; auto dfs2 = [&](auto& dfs2, int now, int key) -> void { paths[key].emplace_back(now); int arg = -1; for(int nxt: g[now]){ if(nxt == par[now]) continue; if(sub[nxt] > sub[arg]) arg = nxt; } if(arg != -1) dfs2(dfs2, arg, key); for(int nxt: g[now]){ if(nxt == par[now] || nxt == arg) continue; paths.emplace_back(); dfs2(dfs2, nxt, paths.size() - 1); } }; dfs2(dfs2, 0, 0); vector inv_idx(n), which_path(n), idx_in_path(n); int c = 0, d = 0; for(vector path: paths){ int e = 0; for(int vertex: path){ inv_idx[vertex] = c; which_path[vertex] = d; idx_in_path[vertex] = e; c++; e++; } d++; } segtree seg1(n), seg2(n); vector>> sets(n); vector col(n, 0); for(int i = 0; i < n; i++) sets[i].insert({1e9, -1}); int q; cin >> q; while(q--){ int t, v; cin >> t >> v; v--; if(t == 1){ int pos = v; pair p = {dep[v], v}; while(true){ if(col[v] == 0) sets[pos].insert(p); else sets[pos].erase(p); int d = (*sets[pos].begin()).first; seg1.set(inv_idx[pos], d); seg2.set(inv_idx[pos], d - 2 * dep[pos]); pos = par[paths[which_path[pos]][0]]; if(pos == -1) break; } col[v] ^= 1; } else{ int ans = 1e9; int pos = v; while(true){ ans = min(ans, seg1.prod(inv_idx[pos], inv_idx[paths[which_path[pos]].back()] + 1) + dep[v] - 2 * dep[pos]); ans = min(ans, seg2.prod(inv_idx[pos] - idx_in_path[pos], inv_idx[pos] + 1) + dep[v]); pos = par[paths[which_path[pos]][0]]; if(pos == -1) break; } cout << ans << "\n"; } } }