#include #include #include using namespace std; #define INF 999999999 int n,q; vector Graph[100011]; int In[100011]; int WhoIs[100011]; int inctr=0; int Depth[100011]; int First[100011]; int IT[1200001]; int L=0; int LEAFOFFSET=1; void DFS(int ver,int dad) { int i; inctr++; In[ver]=inctr; WhoIs[inctr]=ver; L++; IT[L+LEAFOFFSET]=inctr; First[ver]=L; for (i=0;ir || R=l && R<=r) { return IT[ver]; } else { return MIN( MinRec(2*ver,L,(L+R)/2,l,r) , MinRec(2*ver+1,(L+R)/2+1,R,l,r) ); } } int GetMin(int L,int R) { return MinRec(1,1,LEAFOFFSET+1,L,R); } int GetLCA(int a,int b) { int L,R; int d; L=First[a]; R=First[b]; if (L>R) { d=L; L=R; R=d; } return WhoIs[ GetMin(L,R) ]; } void Print(int a,int b,int ans) { if (a==ans || b==ans) { printf("-1\n"); } else { printf("%d\n",ans); } return; } int main() { //freopen("test.txt","r",stdin); int i; int a,b; int c; int Root=1; int lcA,lcB; scanf("%d %d",&n,&q); while(LEAFOFFSET<2*n+2) LEAFOFFSET*=2; LEAFOFFSET--; for (i=0;i<=2*LEAFOFFSET+1;i++) { IT[i]=INF; } for (i=1;i<=n-1;i++) { scanf("%d %d",&a,&b); Graph[a].push_back(b); Graph[b].push_back(a); } Depth[1]=1; DFS(1,0); for (i=LEAFOFFSET;i>=1;i--) { IT[i]=MIN(IT[2*i],IT[2*i+1]); } for (i=1;i<=q;i++) { scanf("%d",&c); if (c==1) { scanf("%d",&Root); } else { scanf("%d %d",&a,&b); lcA=GetLCA(a,Root); lcB=GetLCA(b,Root); if (lcA==lcB) { lcA=GetLCA(a,b); Print(a,b,lcA); } else { if (Depth[lcA]>Depth[lcB]) Print(a,b,lcA); else Print(a,b,lcB); } } } return 0; }