#include <cstdio> #include <vector> #include <queue> #define NMAX 1000 using namespace std; //FILE* fin=freopen("date.in","r",stdin); //FILE* fout=freopen("date.out","w",stdout); vector <int> G[NMAX]; void BFS(); int n,m,uz[NMAX],tata[NMAX],ceo; int lca(int x,int y); int main() { int i,x,y,a; scanf("%d %d ",&n,&m); for (i=1; i<n; i++) { scanf("%d %d",&x,&y); G[x].push_back(y); G[y].push_back(x); } BFS(); ceo=1; for (i=1; i<=m; i++) { scanf("%d",&a); if (a==1) { scanf("%d",&x); tata[ceo]=x; tata[x]=0; ceo=x; continue; } if (a==2) { scanf("%d %d",&x,&y); printf("%d\n",lca(x,y)); } } return 0; } void BFS() { queue <int> q; int i,crt; q.push(1); uz[1]=1; tata[1]=-1; while (!q.empty()) { crt=q.front(); q.pop(); for (i=0; i<G[crt].size(); i++) { if (!tata[G[crt][i]]) { tata[G[crt][i]]=crt; } if (!uz[G[crt][i]]) { q.push(G[crt][i]); uz[G[crt][i]]=1;} } } tata[1]=0; } int lca(int x,int y) { int i,x1=x,y1=y; for (i=1; i<=n; i++) uz[i]=0; if (!tata[x] || !tata[y]) return ceo; while (tata[x]) { if (tata[x]==y1) return -1; uz[tata[x]]=1; x=tata[x]; } while (tata[y]) { if (tata[y]==x1) return -1; if (uz[tata[y]]==1) return tata[y]; y=tata[y]; } }