求助只过了第11个点
查看原帖
求助只过了第11个点
303105
haiming楼主2025/8/29 20:40
#include<bits/stdc++.h>
#define lu u*2
#define ru u*2+1
using namespace std;
int n,m,r,p,i,a[200000],nxt[200000],head[200000],to[200000],cnt,tot,b[200000],x,y,f[200000],T,z,tre[500000],laz[500000];
char ch;
struct node{
	int dep,hs,len,fa,top,dfn;
}tr[200000];
void add(int u,int v){nxt[++cnt]=head[u];head[u]=cnt;to[cnt]=v;}
int dfs1(int u,int dep,int fa){
	tr[u].dep=dep;
	tr[u].hs=0;
	tr[u].len=1;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==fa)continue;
		tr[u].len+=dfs1(v,dep+1,u);
		tr[v].fa=u;
		if(tr[v].len>tr[tr[u].hs].len)tr[u].hs=v;
	}
	return tr[u].len;
}
void dfs2(int u,int top){
	tr[u].top=top;
	tot++;
	tr[u].dfn=tot;
	b[tot]=u;
	if(tr[u].hs){
		dfs2(tr[u].hs,top);
		for(int i=head[u];i;i=nxt[i])
			if(to[i]!=tr[u].fa&&to[i]!=tr[u].hs){
				dfs2(to[i],to[i]);
			}
	}
}
void build(int u,int x,int y){
	if(x==y){
		tre[u]=0;
		return;
	}
	int mid=(x+y)>>1;
	build(lu,x,mid);build(ru,mid+1,y);
//	tre[u]=max(tre[lu],tre[ru]);
}
void down(int u,int x,int y,int mid){
	laz[lu]=max(laz[lu],laz[u]);laz[ru]=max(laz[ru],laz[u]);
	tre[lu]=max(tre[lu],laz[lu]);tre[ru]=max(tre[ru],laz[ru]);
	laz[u]=0;
}
void add(int u,int x,int y,int l,int r){
	if(l<=x&&y<=r){
		tre[u]=laz[u]=max(tre[u],l);
		return;
	}
	int mid=(x+y)>>1;
	down(u,x,y,mid);
	if(l<=mid)add(lu,x,mid,l,r);
	if(r>mid)add(ru,mid+1,y,l,r);
	tre[u]=max(tre[lu],tre[ru]);
}
int query(int u,int x,int y,int l,int r){
	if(l<=x&&y<=r)return tre[u];
	int mid=(x+y)>>1,s=0;
	down(u,x,y,mid);
	if(l<=mid)s=max(s,query(lu,x,mid,l,r));
	if(r>mid)s=max(s,query(ru,mid+1,y,l,r));
	return s;
}
int main(){
	scanf("%d%d",&n,&m);
	for(i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	dfs1(1,1,0);
	dfs2(1,1);
	build(1,1,n);
	add(1,1,n,tr[1].dfn,n);
	for(i=1;i<=m;i++){
        getchar();getchar();
		scanf("%c%d",&ch,&x);
		if(ch=='C'){
			add(1,1,n,tr[x].dfn,tr[x].dfn+tr[x].len-1);
		}else{
			printf("%d\n",b[query(1,1,n,tr[x].dfn,tr[x].dfn)]);
		}
	}
	return 0;
}
2025/8/29 20:40
加载中...