TLE 12pts
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int v,w,next;
}edge[1000005<<2];
int head[1000005],num;
void add(int u,int v,int w){
edge[++num].next=head[u];
head[u]=num;
edge[num].w=w;
edge[num].v=v;
}
int son[1000005],fa[1000005],dep[1000005],siz[1000005];
int top[1000005],id[1000005],tmp[1000005],cnt;
int t[1000005];
void dfs1(int now,int fath,int deep){
fa[now]=fath;
dep[now]=deep;
siz[now]=1;
int maxson=-1;
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].v;
if(v==fath)continue;
dfs1(v,now,deep+1);
if(siz[v]>maxson){
maxson=siz[v];
son[now]=v;
}
siz[now]+=siz[v];
}
}
void dfs2(int now,int topf){
top[now]=topf;
id[now]=++cnt;
t[cnt]=now;
tmp[cnt]=1;
if(!son[now])return;
dfs2(son[now],now);
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].v;
if(v==fa[now]||v==son[now])continue;
dfs2(v,v);
}
}
struct tree{
int val,tag;
}tree[4000005];
int a[1000005];
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void pushup(int p){
tree[p].val=tree[ls(p)].val+tree[rs(p)].val;
}
inline void pushdown(int p,int l,int r){
if(!tree[p].tag)return;
int mid=l+r>>1;
tree[ls(p)].val=mid-l+1-tree[ls(p)].val;
tree[rs(p)].val=r-mid-tree[rs(p)].val;
tree[ls(p)].tag^=1;
tree[rs(p)].tag^=1;
tree[p].tag=0;
}
inline void update(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql){
return;
}
if(qr>=r&&ql<=l){
tree[p].val=(r-l+1)-tree[p].val;
tree[p].tag^=1;
return;
}
int mid=l+r>>1;
pushdown(p,l,r);
update(ls(p),l,mid,ql,qr);
update(rs(p),mid+1,r,ql,qr);
pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql)return INT_MAX;
if(l==r)return l;
int ct=INT_MAX;
int mid=l+r>>1;
// cout<<t
if(tree[ls(p)].val>0&&!(l>qr||mid<ql)){
ct=query(ls(p),l,mid,ql,qr);
}
if(ct!=INT_MAX)return ct;
if(tree[rs(p)].val>0&&!(mid+1>qr||r<ql)){
ct=query(rs(p),mid+1,r,ql,qr);
}
// cout<<ct<<" "<<l<<" "<<r<<" "<<tree[ls(p)].val<<" "<<tree[rs(p)].val<<endl;
return ct;
}
int n;
inline int queryx(int x,int y){
int ans=INT_MAX;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=min(ans,query(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=min(ans,query(1,1,n,id[x],id[y]));
return ans==INT_MAX?-1:ans;
}
signed main(){
ios::sync_with_stdio(false);
int q;
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v,0);
add(v,u,0);
}
dfs1(1,0,1);
dfs2(1,1);
while(q--){
int op,v;
cin>>op>>v;
if(op==0){
update(1,1,n,id[v],id[v]);
}
else{
cout<<((queryx(1,v)==-1)?-1:t[queryx(1,v)])<<"\n";
}
}
return 0;
}