#include <bits/stdc++.h>
using namespace std;


const int MAX = 1e5 + 5;
const int LOG = 18;
const int INF = 1e6;
template<int MAXN, int MAXLG> struct centroidDecomp{
    vector<int> adj[MAXN];
    int sz[MAXN]; //size of subtree
    int cpar[MAXN];//parent in centroid tree
    multiset<pair<int, int>> cdist[MAXN];
    int color [MAX];
    bool vis[MAXN]; //visited array

    int L[MAXLG][MAXN]; //lca
    int depth[MAXN]; //depth
    void addEdge(int u, int v){
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }
    int getDist(int v){
        if(cdist[v].empty() == true){
            return INF;
        }
        return (*(cdist[v].rbegin())).first;
    }
    void dfs(int n, int p) {
        depth[n] = depth[p] + 1;
        L[0][n] = p;
        for (int i = 0; i < MAXLG - 1; i++)
            L[i + 1][n] = L[i][L[i][n]];
        for (int v : adj[n]) if (v != p) {
            dfs(v, n);
        }
    }

    int lca(int u, int v) {
        if (depth[u] < depth[v])
            swap(u, v);
        for (int i = MAXLG - 1; i >= 0; i--) {
            if (depth[u] - (1<<i) >= depth[v])
                u = L[i][u];
        }
        for (int i = MAXLG - 1; i >= 0; i--) {
            if (L[i][u] != L[i][v])
                u = L[i][u], v = L[i][v];
        }
        return u == v ? u : L[0][u];
    }

    int dist(int u, int v) {
        return depth[u] + depth[v] - 2 * depth[lca(u, v)];
    }

    void dfs_sz(int n, int p=-1) {
        sz[n] = 1;
        for (int v : adj[n]) if (v != p && !vis[v]) {
            dfs_sz(v, n);
            sz[n] += sz[v];
        }
    }

    int centroid(int n) {
        dfs_sz(n);
        int num = sz[n];
        int p = -1;
        do {
            int nxt = -1;
            for (int v : adj[n]) if (!vis[v] && v != p) {
                if (2 * sz[v] > num)
                    nxt = v;
            }
            p = n, n = nxt;
        } while (~n);
        return p;
    }
    int closest(int v){
        int ans = getDist(v);
       // cout << ans << " asdf "<< v << endl;
        for (int n = v; n>=0; n = cpar[n]){
            ans = min(ans, getDist(n) + dist(n, v));
            //cout << getDist(n) << "asdf" << endl;
        }
        return ans;
    }
    void toggle(int v){
        color[v] = 1-color[v];
        if(color[v] == 1){
            for (int n = v; n>=0; n = cpar[n]){
				cdist[n].insert(make_pair(dist(n, v), v));
				//cout << dist(n, v) << " inserted " << v << " " << n << endl;
            }
        }
        else{
            for (int n = v; n>=0; n = cpar[n]){
                cdist[n].erase(make_pair(dist(n, v), v));
            }
        }

    }
    void centroid_decomp(int n, int p=-1) {
        int c = centroid(n);
        vis[c] = true;
        cpar[c] = p;
        for (int v : adj[c]) if (!vis[v]) {
            centroid_decomp(v, c);
        }
    }
};

int n, q;

centroidDecomp<MAX, LOG> cd;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	for (int i = 0; i < n-1; i++) {
		int u, v;
		cin >> u >> v;
		u--; v--;
		cd.addEdge(u, v);
	}

	cd.dfs(0, 0);
	cd.centroid_decomp(0);
    cin >> q;
	for(int i = 0; i<q; i++) {
		int t, v;
		cin >> t >> v;
		v--;
		if (t == 0) {
            cd.toggle(v);
		}
		else {
            int ans = cd.closest(v);
            if(ans >= n || ans <0){
                cout << -1 << endl;
                continue;
            }
			cout <<  ans << endl;;
		}
	}
	return 0;
}
