#include using namespace std; #define MAXN 100050 #define MAXLOGN 20 int N, M, a, b, t; vector A[MAXN]; int T[MAXN]; int lvl[MAXN]; int dp[MAXLOGN][MAXN]; int maxk; int root; void dfs(int node, int prv) { lvl[node] = prv == -1 ? 0 : lvl[prv] + 1; T[node] = prv; for (vector :: iterator it = A[node].begin(); it != A[node].end(); it++) { int x = *it; if (x != prv) { dfs(x, node); } } } void precalc() { for (int i = 0; i < N; i++) { dp[0][i] = T[i]; } maxk = 0; for (int j = 1; (1 << j) <= N; j++) { for (int i = 0; i < N; i++) { if (dp[j - 1][i] == -1) { dp[j][i] = -1; } else { dp[j][i] = dp[j - 1][ dp[j - 1][i] ]; } } maxk = j; } } int kthAncestor(int x, int k) { for (int i = maxk; i >= 0; i--) { if ((k & (1 << i)) > 0) { x = dp[i][x]; assert(x != -1); } } return x; } int lca(int x, int y) { if (lvl[x] < lvl[y]) { swap(x, y); } x = kthAncestor(x, lvl[x] - lvl[y]); if (x == y) { return x; } for (int i = maxk; i >= 0; i--) { if (dp[i][x] != -1 && dp[i][y] != -1 && dp[i][x] != dp[i][y]) { x = dp[i][x]; y = dp[i][y]; } } return dp[0][x]; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d %d", &N, &M); for (int i = 0; i < N - 1; i++) { scanf("%d %d", &a, &b); a--; b--; A[a].push_back(b); A[b].push_back(a); } dfs(0, -1); precalc(); root = 0; while (M--) { scanf("%d", &t); if (t == 1) { scanf("%d", &a); a--; root = a; } else { scanf("%d %d", &a, &b); a--; b--; int z = lca(a, b); int za = lca(root, a); int zb = lca(root, b); if (z == a || z == b) { if (z == b) { swap(a, b); swap(za, zb); } if (lvl[a] != lvl[za] || zb == b || zb == a) { printf("-1\n"); } else { printf("%d\n", zb + 1); } continue; } if (za == a || zb == b) { printf("-1\n"); continue; } if (lvl[za] > lvl[z]) { printf("%d\n", za + 1); } else if (lvl[zb] > lvl[z]) { printf("%d\n", zb + 1); } else { printf("%d\n", z + 1); } } } return 0; }