#include #include #include //#include using namespace std; typedef struct celula { int nod; celula *next; } *lista; lista graf[100005],v; int i,j,n,m,stramos[100005][20],lev[100005]; int viz[100005]; int newroot=1; void dfs(int nod, int l) { viz[nod]=1; lev[nod]=l; for (lista p=graf[nod]; p; p=p->next) if (viz[p->nod]==0) { dfs(p->nod,l+1); stramos[p->nod][0]=nod; } } int levelup(int x, int l) { for (int i=19; i>=0; --i) if (lev[stramos[x][i]]>=l) x=stramos[x][i]; return x; } int lca(int x, int y) { if (lev[x]=0; --i) if (stramos[x][i]!=stramos[y][i]) { x=stramos[x][i]; y=stramos[y][i]; } return stramos[x][0]; } } int main(void) { //freopen("file.in","r",stdin); scanf("%d %d",&n,&m); for (i=1; i>x>>y; scanf("%d %d",&x,&y); v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v; v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v; } dfs(1,1); for (j=1; (1<0; --m) { int x,y,op; scanf("%d",&op); if (op==1) { scanf("%d",&newroot); } else { scanf("%d %d",&x,&y); int oldlca=lca(x,y), lcaxr=lca(x,newroot), lcayr=lca(y,newroot); if (x==y) printf("-1\n"); else if (lcaxr==lcayr&&oldlca!=x&&oldlca!=y) printf("%d\n",oldlca); else if (lcaxr==newroot&&lcayr==oldlca) printf("%d\n",newroot); else if (lcayr==newroot&&lcaxr==oldlca) printf("%d\n",newroot); else if (lcaxr==x&&lcayr==newroot) printf("%d\n",newroot); else if (lcayr==y&&lcaxr==newroot) printf("%d\n",newroot); else printf("-1\n"); } } // getch(); return 0; }