/* Look at me! Look at me! Look at how large the monster inside me has become! */ #include #include #include #include #include #define FIT(a,b) for(vector::iterator a=b.begin();a!=b.end();a++) #define FITP(a,b) for(vector >::iterator a=b.begin();a!=b.end();a++) #define RIT(a,b) for(vector::reverse_iterator a=b.end();a!=b.begin();++a) #include #define ROF(a,b,c) for(int a=b;a>=c;--a) #include #include #define FOR(a,b,c) for(int a=b;a<=c;++a) #define REP(a,b) for(register int a=0;a #include #include #include #include #include #define f cin #define g cout #include #define debug cerr<<"OK"; #define pii pair #define mp make_pair #define pb push_back #define fi first #define se second #define ll long long #define ull unsigned long long #define mod 1000000007 #define MOD 32416190071 #define N 100100 #define SQR 350 #define inf 1<<30 #define div pula #define hash pizda using namespace std; vector v[N],P[N]; int subarb[N],niv[N],T[N],nrl,m,y,poz[N],A[N],lant[N],n,x,tip,cur,ct; void dfs(int x,int lvl,int p) { niv[x]=lvl; T[x]=p; subarb[x]=1; FIT(it,v[x]) if(*it!=p) { subarb[x]+=subarb[*it]; dfs(*it,lvl+1,x); } if(subarb[x]==1) { ++nrl; lant[x]=nrl; P[nrl].pb(0); P[nrl].pb(x); poz[x]=1; return ; } int be=0; FIT(it,v[x]) if(*it!=p) { if(subarb[*it]>subarb[be]) be=*it; } lant[x]=lant[be]; P[lant[x]].pb(x); poz[x]=P[lant[x]].size()-1; } void go(int x) { while(x) { if(poz[x]==P[lant[x]].size()-1) { A[lant[x]]=-1; } else { A[lant[x]]=poz[x]; } x=T[P[lant[x]][1]]; } } void ungo(int x) { while(x) { A[lant[x]]=0; x=T[x]; } } int lca(int x,int y) { while(1) { if(lant[x]==lant[y]) { if(niv[x]=y) { int dif=sum-y; dif++; return P[lant[x]][dif]; } } else { sum+=A[lant[x]]; if(sum>=y) { int dif=sum-y; dif++; return P[lant[x]][dif]; } } x=T[P[lant[x]][1]]; } } int main () { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif f>>n>>m; FOR(i,1,n-1) { f>>x>>y; v[x].pb(y); v[y].pb(x); } dfs(1,1,0); FOR(i,1,nrl) { int siz=P[i].size(); siz--; FOR(j,1,siz/2) { swap(P[i][j],P[i][siz-j+1]); swap(poz[j],poz[siz-j+1]); } } int qry=0; cur=1; go(cur); ct=find(cur); FOR(i,1,m) { f>>tip; if(tip==1) { ungo(cur); f>>cur; go(cur); ct=find(cur); } else { ++qry; if(qry==6) { qry++; qry--; } f>>x>>y; int z=lca(x,y); int tot=find(x)+find(y)-2*find(z); if(!tot) { if(z!=x&&z!=y) g<