树剖+线段树 大佬帮忙看看求求了qwq
#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N=123456 ;
int n , q , dfs[N] , fa[N] , top[N] , dep[N] , sz[N] , son[N] , tot=0 , be[N] ;
vector<int> e[N] ;
struct node{
int minn , l , r ;
}tree[N*4];
void dfs1(int u,int f){
fa[u] = f ;
dep[u] = dep[f]+1 ;
sz[u] = 1 ;
for(auto x:e[u]){
if(x==f) continue ;
dfs1(x,u) ;
sz[u] += sz[x] ;
if(!son[u]||sz[son[u]]<sz[x]) son[u] = x ;
}
}
void dfs2(int u,int head){
dfs[u] = ++tot ;
be[tot] = u ;
top[u] = head ;
if(son[u]) dfs2(son[u],head) ;
for(auto x:e[u]){
if(x==fa[u]||x==son[u]) continue ;
dfs2(x,x) ;
}
}
void push_up(int num){
if(tree[num<<1].minn!=-1){
if(tree[num<<1|1].minn!=-1)
tree[num].minn = min(tree[num<<1].minn,tree[num<<1|1].minn) ;
else
tree[num].minn = tree[num<<1].minn ;
}else{
if(tree[num<<1|1].minn!=-1)
tree[num].minn = tree[num<<1|1].minn ;
else
tree[num].minn = -1 ;
}
}
void made(int num,int l,int r){
tree[num].l = l ;
tree[num].r = r ;
if(l==r){
tree[num].minn = -1 ;
return ;
}
int mid=(l+r)>>1 ;
made(num<<1,l,mid) ;
made(num<<1|1,mid+1,r) ;
push_up(num) ;
}
void change(int num,int x){
if(tree[num].l==x&&x==tree[num].r){
if(tree[num].minn==-1) tree[num].minn = be[tree[num].l] ;
else tree[num].minn = -1 ;
return ;
}
int mid=(tree[num].l+tree[num].r)>>1 ;
if(mid>=x) change(num<<1,x) ;
else change(num<<1|1,x) ;
push_up(num) ;
}
int ask(int num,int l,int r){
if(tree[num].l>=l&&tree[num].r<=r)
return tree[num].minn ;
int mid=(tree[num].l+tree[num].r)>>1 , minn=-1 ;
if(mid>=l){
int temp=ask(num<<1,l,r) ;
if(temp!=-1) minn = (minn==-1?temp:min(minn,temp)) ;
}
if(mid<r){
int temp=ask(num<<1|1,l,r) ;
if(temp!=-1) minn = (minn==-1?temp:min(minn,temp)) ;
}
return minn ;
}
int LCA(int x,int y){
int ans=-1 , temp=0 ;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y) ;
temp = ask(1,dfs[top[x]],dfs[x]) ;
if(temp!=-1) ans = (ans==-1?temp:min(ans,temp)) ;
x = fa[top[x]] ;
}
if(dep[x]>dep[y]) swap(x,y) ;
temp = ask(1,dfs[x],dfs[y]) ;
if(temp!=-1) ans = (ans==-1?temp:min(ans,temp)) ;
return ans ;
}
signed main(){
cin >> n >> q ;
for(int i=1;i<n;i++){
int u , v ;
scanf("%lld%lld",&u,&v) ;
e[u].push_back(v) ;
e[v].push_back(u) ;
}
dfs1(1,0) ;
dfs2(1,1) ;
made(1,1,n) ;
for(int i=1;i<=q;i++){
int opt , u ;
scanf("%lld%lld",&opt,&u) ;
if(opt)
printf("%lld\n",LCA(1,u)) ;
else
change(1,dfs[u]) ;
}
return 0 ;
}