记录编号 593867 评测结果 WWWWE
题目名称 [HZOI 2015]白黑树 最终得分 0
用户昵称 Gravatarwdsjl 是否通过 未通过
代码语言 C++ 运行时间 0.314 s
提交时间 2024-09-19 21:42:47 内存使用 7.03 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
const int INF = 0x7f7f7f7f;

struct E{
	int to,ne;
}e[N*2];

int tot,h[N],n,q,ying[N];

void add(int u,int v){
	e[tot]={v,h[u]};
	h[u]=tot++;
	e[tot]={u,h[v]};
	h[v]=tot++;
	return ;
} 

int fa[N],siz[N],son[N],dep[N];

void dfs1(int u,int f){
	fa[u]=f;
	siz[u]=1;
	dep[u]=dep[f]+1;
	int maxsiz=-1;
	for(int i=h[u];~i;i=e[i].ne){
		int v=e[i].to;
		if(v==f)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>maxsiz){
			maxsiz=siz[v];
			son[u]=v;
		}
	}
	return ;
}

int dfn[N],w[N],v[N],top[N],tim;

void dfs2(int u,int t){
	top[u]=t;
	dfn[u]=++tim;
	ying[tim]=u; 
	w[tim]=tim;
	if(!son[u])return ;
	dfs2(son[u],t);
	for(int i=h[u];~i;i=e[i].ne){
		int v=e[i].to;
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
} 

int minv[N*4];

void pushup(int k){
	minv[k]=min(minv[k*2],minv[k*2+1]);
} 

void build(int k,int l,int r){
	int mid=(l+r)>>1;
	if(l==r){
		minv[k]=INF;
		return ;
	}
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	pushup(k);
	return ;
}

void update(int k,int l,int r,int q,int v){
	int mid=(l+r)>>1;
	if(l==r){
		minv[k]=v;
		return ;
	}
	if(q<=mid)update(k*2,l,mid,q,v);
	else update(k*2+1,mid+1,r,q,v);
	pushup(k);
	return ;
}

int querymin(int k,int l,int r,int ql,int qr){
	int mid=(l+r)>>1,ans=INF;
	if(ql<=l&&r<=qr)return minv[k];
	if(ql<=mid)ans=min(ans,querymin(k*2,l,mid,ql,qr));
	if(qr>mid)ans=min(ans,querymin(k*2+1,mid+1,r,ql,qr));
	pushup(k);
	return ans;
}

int qmin(int u,int v){
	int ans=INF;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		ans=min(ans,querymin(1,1,n,dfn[top[u]],dfn[u]));
		u=fa[top[u]];
	}
	if(dep[u]<dep[v])swap(u,v);
	ans=min(ans,querymin(1,1,n,dfn[v],dfn[u]));
	return ans;
}

int main(){
	freopen("C_Tree.in","r",stdin);
	freopen("C_Tree.out","w",stdout);
	memset(minv,0x7f,sizeof(minv));
	memset(h,-1,sizeof(h));
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
	}
	dep[1]=1;
	fa[1]=1;
	dfs1(1,-1);
	dfs2(1,1);
	for(int i=1;i<=q;i++){
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==0){
			if(qmin(x,x)==0x7f7f7f7f){
				update(1,1,n,dfn[x],dfn[x]);
			}else update(1,1,n,dfn[x],INF);
		}else if(op==1){
			if(qmin(1,x)==0x7f7f7f7f)printf("-1\n");
			else printf("%d\n",ying[qmin(1,x)]);
		}
	}
	return 0;
}