树剖,每次从1到v跑一遍线段树上的最小值
初始设置为全INF,如果结果是INF就输出-1,否则这个最小值就是答案
修改就单点修改,在线段树上改一个点
我寻思着我思路和代码好像都没问题哇,到底哪错了qwq
#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c)) w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void print(int x){
if(x<0) x=-x,putchar('-');
if(x>9) print(x/10);
putchar('0'+x%10);
}
const int N=1e5+5,INF=1e8;
int tree[N*3];
int head[N],top[N],siz[N],fa[N],son[N],dep[N],id[N],tag[N];
int n,Q,num,tot;
struct node{
int to,nxt;
}Edge[N<<1];
inline void add(int u,int v){
Edge[++tot].nxt=head[u];
Edge[tot].to=v;
head[u]=tot;
}
inline void dfs1(int x,int f){
dep[x]=dep[f]+1,fa[x]=f,siz[x]=1;
for(register int i=head[x];i;i=Edge[i].nxt){
int v=Edge[i].to;
if(v==f) continue;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[v]>siz[son[x]]) son[x]=v;
}
}
inline void dfs2(int x,int topx){
top[x]=topx,id[x]=++num;
if(!son[x]) return ;
dfs2(son[x],topx);
for(register int i=head[x];i;i=Edge[i].nxt){
int v=Edge[i].to;
if(v==fa[x] || v==son[x]) continue;
dfs2(v,v);
}
}
#define ls(x) x<<1
#define rs(x) x<<1|1
#define push_up(p) tree[p]=min(tree[ls(p)],tree[rs(p)])
inline void update(int p,int l,int r,int pl,int pr,int k){
// cout<<p<<' '<<l<<' '<<r<<' '<<pl<<' '<<pr<<endl;
if(l>pr || r<pl) return ;
if(l>=pl && r<=pr){
tree[p]=k;
return ;
}
int mid=l+r>>1;
if(pl<=mid) update(ls(p),l,mid,pl,pr,k);
if(pr>mid) update(rs(p),mid+1,r,pl,pr,k);
push_up(p);
}
inline int query(int p,int l,int r,int pl,int pr){
if(l>pr || r<pl) return INF;
if(l>=pl && r<=pr) return tree[p];
int mid=l+r>>1,res=INF;
if(pl<=mid) res=min(res,query(ls(p),l,mid,pl,pr));
if(pr>mid) res=min(res,query(rs(p),mid+1,r,pl,pr));
return res;
}
inline int Query(int x,int y){
int res=INF;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res=min(res,query(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
res=min(res,query(1,1,n,id[x],id[y]));
if(res==INF) return -1;
return res;
}
signed main(){
n=read(),Q=read();
for(register int i=1;i<=n*3;++i) tree[i]=INF;
for(register int i=1;i<n;++i){
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs1(1,1);
dfs2(1,1);
// for(register int i=1;i<=n;++i)
// cout<<id[i]<<' ';cout<<endl;
while(Q--){
int op=read(),v=read();
if(op==1) printlf(Query(1,v));
else{
if(tag[v]) update(1,1,n,id[v],id[v],INF);
else update(1,1,n,id[v],id[v],v);
tag[v]^=1;
}
}
return 0;
}