#include #include #include using namespace std; #define MAX_N 110005 #define MAX_L 20 #define foreach(V) for (typeof (V).begin() it = (V).begin() ; it != (V).end();++it) int K,N,M; int L[MAX_N << 1], H[MAX_N << 1],Lg[MAX_N << 1], First[MAX_N]; int Rmq[MAX_L][MAX_N << 2]; char viz[MAX_N]; vector G[MAX_N]; void citire() { cin >> N >> M; for (int i = 2 ; i <= N ; ++i) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } } void dfs(int nod, int lev) { H[++K] = nod; L[K] = lev; First[nod] = K; viz[nod] = 1; foreach(G[nod]) { if (viz[*it] == 0) { dfs(*it, lev+1); H[++K] = nod; L[K] = lev; } } } void rmq() { for (int i = 1 ; i <= K ; ++i) Rmq[0][i] = i; for (int i = 1 ; (1 << i) < K ; ++i) { for (int j = 1 ; j <= K - (1 << i); ++j) { int l = 1 << (i - 1); Rmq[i][j] = Rmq[i - 1][j]; if (L[Rmq[i-1][j+l]] < L[Rmq[i][j]]) Rmq[i][j] = Rmq[i-1][j+l]; } } } int lca(int x, int y) { int diff, l, sol, sh; int a = First[x], b = First[y]; if (a>b) swap(a, b); diff = b - a + 1; l = Lg[diff]; sol=Rmq[l][a]; sh = diff - (1 << l); if (L[sol] > L[Rmq[l][a+sh]]) sol = Rmq[l][a+sh]; return H[sol]; } int main() { int lastroot = 1,newroot = 1; citire(); for (int i = 2 ; i <= 2 * (N + 1) ; ++i) { Lg[i] = Lg[i>>1] + 1; } dfs(1, 0); rmq(); while (M--) { int x,y,z;cin>>x; if (x == 1) { cin>>newroot; } else { if (newroot != lastroot) { lastroot = newroot; K=0; memset(viz,0,N+5); memset(First, 0, 2*N+5); dfs(newroot, 0); rmq(); } cin >> y >> z; int lcaz = lca(y,z); if (lcaz == y || lcaz == z) { cout << -1 << "\n"; } else cout << lcaz << "\n"; } } return 0; }