#include <iostream> #include <algorithm> #include <vector> #define NMAX 100005 #define lsb(x) ((x)&(-x)) using namespace std; int n,poz1; int first[NMAX]; int last[NMAX]; vector<int> graf[NMAX]; int father[NMAX],poz2,hul; int euler[2*NMAX]; int unde[NMAX]; int h[2*NMAX]; void dfs(int nod){ euler[++poz2]=nod; unde[nod]=poz2; h[poz2]=++hul; first[nod]=++poz1; for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++) if(*it!=father[nod]){ father[*it]=nod; dfs(*it); euler[++poz2]=nod; h[poz2]=hul; } last[nod]=++poz1; --hul; } int logar[2*NMAX]; int din[19][2*NMAX]; void precalc_rmq(){ logar[2]=1; for(int i=3;i<2*NMAX;i++) logar[i]=1+logar[i/2]; int i,j; for(i=1;i<=poz2;i++) din[0][i]=i; for(i=1;(1<<i)<=poz2;i++) for(j=1;j+(1<<i)-1<=poz2;j++) if(h[din[i-1][j]]<h[din[i-1][j+(1<<(i-1))]]) din[i][j]=din[i-1][j]; else din[i][j]=din[i-1][j+(1<<(i-1))]; } inline int lca(int a,int b){ a=unde[a]; b=unde[b]; if(a>b) swap(a,b); int y=logar[b-a+1]; if(h[din[y][a]]<h[din[y][b-(1<<y)+1]]) return euler[din[y][a]]; return euler[din[y][b-(1<<y)+1]]; } inline int dist (int a, int b) { int l=lca(a,b); return (h[a]+h[b]-h[l]); } int main() { //ifstream cin("disconnect.in"); //ofstream cout("disconnect.out"); int m=0; cin>>n>>m; int x,y; for(int i=1;i<n;i++){ cin>>x>>y; graf[x].push_back(y); graf[y].push_back(x); } dfs(1); precalc_rmq(); int type; int _rad; while(m--) { cin>>type; if(type==1) { cin>>x; _rad=x; } else { cin>>x>>y; if(dist(x,_rad)+dist(_rad,y)==dist(x,y)) { cout<<_rad<<endl; continue; } else if(dist(_rad,x)+dist(x,y)==dist(_rad,y)) { cout<<_rad<<endl; continue; } else if(dist(x,y)+dist(y,_rad)==dist(x,_rad)) { cout<<_rad<<endl; continue; } int l=lca(x,y); int p=lca(x,_rad); int t=lca(y,_rad ); int ans; if(t==l) { ans=p; } else if(p==l) { ans=t; } else ans=l; if(ans==x || ans==y) { cout<<"-1\n"; } else cout<<ans<<endl; } } //cin.close(); //cout.close(); return 0; }