// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll long long
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#define fi first
#define se second
#define M 1000000007
#define MAXN 100001
#define GIOIHAN 1000001
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); // dùng để nén sort mảng compare
using namespace std;
const ll MOD[ ] = { ( ll) 1e9 + 2277 , ( ll) 1e9 + 5277 , ( ll) 1e9 + 8277 , ( ll) 1e9 + 9277 , ( ll) 1e9 + 7 } ;
const ll NMOD = 1 ;
const int dx[ ] = { - 1 , 0 , 1 ,0 } ;
const int dy[ ] = { 0 , 1 , 0 , - 1 } ;
//**Variable**//
ll n, q ;
ll arr[ MAXN] ;
vector< ll> adj[ MAXN] ;
ll high[ MAXN] ;
ll tour[ MAXN] ;
ll fin[ MAXN] ;
ll par[ MAXN ] ;
ll st [ MAXN] ;
ll chainID[ MAXN] ;
ll chainHead[ MAXN] ;
ll sz[ MAXN] ;
ll curchain = 1 , timedfs = 0 ; // 0 : trang , 1 : den
//**Struct**//
struct Seg {
ll val[ MAXN<< 2 ] ;
void update( ll id, ll l, ll r,ll pos ) {
if ( l == r ) {
val[ id] ^ = 1 ; // cập nhất 0 thành 1 , 1 thành 0
} else {
ll m = l + r >> 1 ;
if ( m>= pos ) update( id<< 1 ,l, m, pos ) ;
else update( id<< 1 | 1 , m + 1 , r,pos ) ;
val[ id] = max( val[ id<< 1 ] , val[ id<< 1 | 1 ] ) ;
}
}
ll get( ll id, ll l, ll r, ll u, ll v ) {
if ( u > r || v < l ) return - 1 ;
if ( l == r ) return l ;
ll ans = - 1 ;
ll m = l + r >> 1 ;
if ( val[ id<< 1 ] >= 1 ) ans = get( id<< 1 , l, m, u, v ) ;
if ( ans == - 1 && val[ id<< 1 | 1 ] >= 1 ) ans = get( id<< 1 | 1 , m + 1 , r, u, v ) ; // walk on tree, thử trường hợp gần trước rồi mới đến xa
return ans ;
}
} seg;
//**Function**//
void dfs( ll u, ll p ) {
sz[ u] = 1 ;
for ( ll v : adj[ u] ) {
if ( v == p ) continue ;
par[ v] = u ;
high[ v] = high[ u] + 1 ;
dfs( v, u ) ;
sz[ u] + = sz[ v] ;
}
}
void hld( ll u, ll p ) {
if ( ! chainHead[ curchain] ) {
chainHead[ curchain ] = u ;
}
st[ u] = ++ timedfs ;
tour[ timedfs] = u ;
chainID[ u] = curchain ;
ll nxt = 0 ;
for ( ll v : adj[ u] ) {
if ( v == p ) continue ;
if ( nxt == 0 || sz[ v] > sz[ nxt] ) nxt = v;
}
if ( nxt ) hld( nxt, u ) ;
for ( ll v : adj[ u] ) {
if ( v ! = p && v ! = nxt ) {
curchain ++ ;
hld( v, u ) ;
}
}
fin[ u] = timedfs;
}
ll LCA( ll u, ll v ) {
while ( chainID[ u] ! = chainID[ v] ) {
if ( chainID[ u] > chainID[ v] ) u = par[ chainHead[ chainID[ u] ] ] ;
else v = par[ chainHead[ chainID[ v] ] ] ;
}
return ( high[ u] > high[ v ] ? v : u ) ;
}
ll query( ll u, ll v ) {
ll lca = LCA( u, v ) ;
ll res = - 1 ;
while ( chainID[ u] ! = chainID[ lca] ) {
ll pos= seg.get ( 1 , 1 , n, st[ chainHead[ chainID[ u] ] ] , st[ u] ) ; // cái này mình tìm cạnh đầu tiên suát hiện từ cha của nhánh đến vị trí hiện tại và tìm ngược lên
if ( pos ! = - 1 ) res = tour[ pos] ; // nên kết quả luôn là vị trí đầu tiền
u = par[ chainHead[ chainID[ u] ] ] ;
}
while ( chainID[ v] ! = chainID[ lca] ) {
ll pos= seg.get ( 1 , 1 , n, st[ chainHead[ chainID[ v] ] ] , st[ v] ) ;
if ( pos ! = - 1 ) res = tour[ pos] ;
v = par[ chainHead[ chainID[ v] ] ] ;
}
if ( high[ u] > high[ v] ) swap( u, v) ;
ll pos = seg.get ( 1 ,1 ,n, st[ u] , st[ v] ) ;
if ( pos ! = - 1 ) res = tour[ pos] ;
return res ;
}
void init( ) {
cin >> n>> q ;
for ( ll i = 0 ; i < n - 1 ; i ++ ) {
ll x, y ;
cin >> x>> y ;
adj[ x] .push_back ( y) ;
adj[ y] .push_back ( x) ;
}
dfs( 1 , 1 ) ;
hld( 1 , 1 ) ; // khởi tạo nè
}
void solve( ) {
for ( ll i = 0 ; i < q ; i ++ ) {
ll t,x ;
cin >> t>> x;
if ( t== 0 ) {
seg.update ( 1 ,1 ,n, st[ x] ) ; // update lại seg theo thứ tự đường đi euler
} else {
cout << query( x, 1ll ) << el ; // trả lời query
}
}
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
init( ) ;
solve( ) ;
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgX19ST09UX18gaW50IG1haW4oKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAxMDAwMDEKI2RlZmluZSBHSU9JSEFOIDEwMDAwMDEKI2RlZmluZSBCTE9DS19TSVpFIDQyNQojZGVmaW5lIE1BWF9OT0RFIDEwMDEwMDEKI2RlZmluZSBMT0cgMTkKI2RlZmluZSBBTFBIQV9TSVpFIDI2CiNkZWZpbmUgQkFTRSAzMTEKI2RlZmluZSBOQU1FICJmaWxlIgojZGVmaW5lIGNvbXBhcmUodikgc29ydCgodikuYmVnaW4oKSwgKHYpLmVuZCgpKTsgKHYpLmVyYXNlKHVuaXF1ZSgodikuYmVnaW4oKSwgKHYpLmVuZCgpKSwgKHYpLmVuZCgpKTsgLy8gZMO5bmcgxJHhu4MgbsOpbiBzb3J0IG3huqNuZyBjb21wYXJlCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxsIE1PRFtdID0geyhsbCkxZTkgKyAyMjc3LCAobGwpMWU5ICsgNTI3NywgKGxsKTFlOSArIDgyNzcsIChsbCkxZTkgKyA5Mjc3LCAobGwpIDFlOSArIDcgfTsKY29uc3QgbGwgTk1PRCA9IDE7CmNvbnN0IGludCBkeFtdID0gey0xLCAwLCAxLDB9Owpjb25zdCBpbnQgZHlbXSA9IHswLCAxLCAwLCAtMX07Ci8vKipWYXJpYWJsZSoqLy8KbGwgbiwgcSA7CmxsIGFycltNQVhOXTsKdmVjdG9yPGxsPiBhZGpbTUFYTl07CmxsIGhpZ2hbTUFYTl0gOwpsbCB0b3VyW01BWE5dIDsKbGwgZmluW01BWE5dIDsKbGwgcGFyW01BWE4gXSA7CmxsIHN0IFtNQVhOXSA7CmxsIGNoYWluSURbTUFYTl0gOwpsbCBjaGFpbkhlYWRbTUFYTl0gOwpsbCBzeltNQVhOXSA7CmxsIGN1cmNoYWluID0gMSwgdGltZWRmcyA9IDAgOyAgICAgLy8gMCA6IHRyYW5nICwgMSA6IGRlbgovLyoqU3RydWN0KiovLwpzdHJ1Y3QgU2VnIHsKICAgIGxsIHZhbFtNQVhOPDwgMiBdIDsKICAgIHZvaWQgdXBkYXRlKGxsIGlkLCBsbCBsLCBsbCByLGxsIHBvcyApIHsKICAgICAgICBpZihsID09IHIgKSB7CiAgICAgICAgICAgIHZhbFtpZF0gXj0xIDsgLy8gY+G6rXAgbmjhuqV0IDAgdGjDoG5oIDEgICwgMSB0aMOgbmggIDAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsbCBtID0gbCArIHIgPj4gMSA7CiAgICAgICAgICAgIGlmKG0+PSBwb3MgKSB1cGRhdGUoaWQ8PDEsbCwgbSwgcG9zICkgOwogICAgICAgICAgICBlbHNlIHVwZGF0ZShpZDw8MXwxLCBtICsgMSwgcixwb3MgKSA7CiAgICAgICAgICAgIHZhbFtpZF0gPSBtYXgodmFsW2lkPDwxIF0sIHZhbFtpZDw8MXwxXSkgOwogICAgICAgIH0KICAgIH0KICAgIGxsIGdldChsbCBpZCwgbGwgbCwgbGwgciwgbGwgdSwgbGwgdiApIHsKICAgICAgICBpZih1ID4gciAgfHwgdiA8IGwgICkgcmV0dXJuIC0xIDsKICAgICAgICBpZihsID09IHIgKSByZXR1cm4gbCAgOwogICAgICAgIGxsIGFucyA9IC0xIDsKICAgICAgICBsbCBtID0gbCArIHIgPj4gMTsKICAgICAgICBpZih2YWxbaWQ8PCAxIF0gPj0gMSApIGFucyA9IGdldChpZDw8MSwgbCwgbSwgdSwgdiApICA7CiAgICAgICAgaWYoYW5zID09IC0xICAmJiB2YWxbaWQ8PDF8MV0gPj0xICkgYW5zID0gZ2V0KGlkPDwxfDEsIG0gKyAxLCByLCB1LCB2ICkgOyAvLyB3YWxrIG9uIHRyZWUsIHRo4butIHRyxrDhu51uZyBo4bujcCBn4bqnbiB0csaw4bubYyBy4buTaSBt4bubaSDEkeG6v24geGEgCiAgICAgICAgcmV0dXJuIGFucyAgOwogICAgfQp9IHNlZzsKLy8qKkZ1bmN0aW9uKiovLwp2b2lkIGRmcyhsbCB1LCBsbCBwICkgewogICAgc3pbdV0gPSAxIDsKICAgIGZvcihsbCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiA9PSBwICkgY29udGludWUgOwogICAgICAgIHBhclt2XSA9IHUgOwogICAgICAgIGhpZ2hbdl0gPSBoaWdoW3VdICsgMSA7CiAgICAgICAgZGZzKHYsIHUgKSA7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICB9Cn0Kdm9pZCBobGQobGwgdSwgIGxsIHAgKSB7CiAgICBpZighY2hhaW5IZWFkW2N1cmNoYWluXSkgewogICAgICAgIGNoYWluSGVhZFtjdXJjaGFpbiBdID0gdSAgOwogICAgfQogICAgc3RbdV0gPSArKyB0aW1lZGZzIDsKICAgIHRvdXJbdGltZWRmc10gPSB1IDsKICAgIGNoYWluSURbdV0gPSBjdXJjaGFpbiA7CiAgICBsbCBueHQgPSAwIDsKICAgIGZvcihsbCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiA9PSBwICkgY29udGludWUgOwogICAgICAgIGlmKG54dCA9PSAwIHx8IHN6W3ZdID4gc3pbbnh0XSkgbnh0ID0gdjsKICAgIH0KICAgIGlmKG54dCApIGhsZChueHQsIHUgKSA7CiAgICBmb3IobGwgdiA6IGFkalt1XSkgewogICAgICAgIGlmKHYgIT0gcCAmJiB2ICE9IG54dCApIHsKICAgICAgICAgICAgY3VyY2hhaW4gKysgOwogICAgICAgICAgICBobGQodiwgdSApICA7CiAgICAgICAgfQogICAgfQogICAgZmluW3VdID10aW1lZGZzOwp9CmxsIExDQShsbCB1LCBsbCB2ICkgewogICAgd2hpbGUoY2hhaW5JRFt1XSAhPSBjaGFpbklEW3ZdKSB7CiAgICAgICAgaWYoY2hhaW5JRFt1XSA+IGNoYWluSURbdl0pIHUgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdV1dXTsKICAgICAgICBlbHNlIHYgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdl1dXTsKICAgIH0KICAgIHJldHVybiAoaGlnaFt1XSA+IGhpZ2hbdiBdID8gdiA6IHUgKTsKfQpsbCBxdWVyeShsbCB1LCBsbCB2ICkgewogICAgbGwgbGNhID0gTENBKHUsIHYgKSA7CiAgICBsbCByZXMgPSAtMSA7CiAgICB3aGlsZShjaGFpbklEW3VdICE9IGNoYWluSURbbGNhXSkgewogICAgICAgIGxsIHBvcz0gc2VnLmdldCgxLCAxLCBuLCBzdFtjaGFpbkhlYWRbY2hhaW5JRFt1XV1dLCBzdFt1XSkgOyAgLy8gY8OhaSBuw6B5IG3DrG5oIHTDrG0gY+G6oW5oIMSR4bqndSB0acOqbiBzdcOhdCBoaeG7h24gdOG7qyBjaGEgY+G7p2EgbmjDoW5oIMSR4bq/biB24buLIHRyw60gaGnhu4duIHThuqFpIHbDoCB0w6xtIG5nxrDhu6NjIGzDqm4gCiAgICAgICAgaWYocG9zICE9IC0xICkgcmVzID0gdG91cltwb3NdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG7Dqm4ga+G6v3QgcXXhuqMgbHXDtG4gbMOgIHbhu4sgdHLDrSDEkeG6p3UgdGnhu4FuCiAgICAgICAgdSA9IHBhcltjaGFpbkhlYWRbY2hhaW5JRFt1XV1dIDsKICAgIH0KICAgIHdoaWxlKGNoYWluSURbdl0gIT0gY2hhaW5JRFtsY2FdKSB7CiAgICAgICAgbGwgcG9zPSBzZWcuZ2V0KDEsIDEsIG4sIHN0W2NoYWluSGVhZFtjaGFpbklEW3ZdXV0sIHN0W3ZdKSA7CiAgICAgICAgaWYocG9zICE9IC0xICkgcmVzID0gdG91cltwb3NdIDsKICAgICAgICB2ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gOwogICAgfQogICAgaWYoaGlnaFt1XSA+IGhpZ2hbdl0pIHN3YXAodSwgdikgOwogICAgbGwgcG9zID0gc2VnLmdldCgxLDEsbiwgc3RbdV0sIHN0W3ZdKSA7CiAgICBpZihwb3MgIT0gLTEgKSByZXMgPSB0b3VyW3Bvc10gOwogICAgcmV0dXJuIHJlcyA7Cn0Kdm9pZCBpbml0KCkgewogICAgY2luPj5uPj4gcSA7CiAgICBmb3IobGwgaSA9IDAgOyBpIDwgbiAtIDEgIDsgaSArKyApIHsKICAgICAgICBsbCB4LCAgeSA7CiAgICAgICAgY2luPj54Pj4geSA7CiAgICAgICAgYWRqW3hdLnB1c2hfYmFjayh5KTsKICAgICAgICBhZGpbeV0ucHVzaF9iYWNrKHgpOwogICAgfQogICAgZGZzKDEsIDEgKSA7CiAgICBobGQoMSwgMSApIDsgLy8ga2jhu59pIHThuqFvIG7DqAp9Cgp2b2lkIHNvbHZlKCkgewogICAgZm9yKGxsIGkgPSAwIDsgaSA8IHEgOyBpICsrICkgIHsKICAgICAgICBsbCB0LHggOwogICAgICAgIGNpbiA+PiB0Pj4geDsKICAgICAgICBpZiggdD09IDAgKSB7CiAgICAgICAgICAgIHNlZy51cGRhdGUoMSwxLG4sIHN0W3hdKSA7IC8vIHVwZGF0ZSBs4bqhaSBzZWcgdGhlbyB0aOG7qSB04buxIMSRxrDhu51uZyDEkWkgZXVsZXIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb3V0PDxxdWVyeSh4LCAxbGwgKSA8PGVsIDsgLy8gdHLhuqMgbOG7nWkgcXVlcnkKICAgICAgICB9CiAgICB9Cn0KCl9fUk9PVF9fIHsKLy8gICAgIGZyZW9wZW4oTkFNRSIuaW5wIiAsICJyIiAsIHN0ZGluKTsKLy8gICAgIGZyZW9wZW4oTkFNRSIub3V0IiAsICJ3Iiwgc3Rkb3V0KSA7CiAgICBmYXN0OwogICAgaW5pdCgpOwogICAgc29sdmUoKTsKfQoK