只AC后两个点求调,悬奖
查看原帖
只AC后两个点求调,悬奖
493937
Defy_HeavenS楼主2024/9/16 10:31
#include<bits/stdc++.h>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define pb push_back

using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;

const LL N=1e5+5;
LL n,q,dfn[N],siz[N],dep[N],idx;
vector<LL>g[N];
struct SegNode{
	LL l,r;
	PII ma,tag;
}tr[N<<2];

void dfs(LL u,LL fa){
	dfn[u]=++idx;
	siz[u]=1;
	dep[u]=dep[fa]+1;
	for(auto v:g[u]){
		if(v==fa) continue;
		dfs(v,u);
		siz[u]+=siz[v];
	}
}
inline LL lc(LL rt){return rt<<1;}
inline LL rc(LL rt){return (rt<<1)|1;}
inline void pushup(LL rt){
	tr[rt].ma=max(tr[lc(rt)].ma,tr[rc(rt)].ma);
}
inline void pushdown(LL rt){
	tr[lc(rt)].ma=max(tr[lc(rt)].ma,tr[rt].tag);
	tr[rc(rt)].ma=max(tr[rc(rt)].ma,tr[rt].tag);
	tr[rt].tag={0,0};
}
void build(LL rt,LL L,LL R){
	tr[rt]={L,R,{1,1},{0,0}};
	if(L==R) return;
	LL mid=(L+R)>>1;
	build(lc(rt),L,mid);
	build(rc(rt),mid+1,R);
}
void update(LL rt,LL L,LL R,PII val){
	if(tr[rt].l>=L&&tr[rt].r<=R){
		tr[rt].ma=max(tr[rt].ma,val);
		tr[rt].tag=max(tr[rt].tag,val);
		return;
	}
	pushdown(rt);
	LL mid=(tr[rt].l+tr[rt].r)>>1;
	if(R<=mid){
		update(lc(rt),L,R,val);
	}else if(L>mid){
		update(rc(rt),L,R,val);
	}else{
		update(lc(rt),L,mid,val);
		update(rc(rt),mid+1,R,val);
	}
	pushup(rt);
}
PII query(LL rt,LL pos){
	if(tr[rt].l==tr[rt].r){
		return tr[rt].ma;
	}
	pushdown(rt);
	LL mid=(tr[rt].l+tr[rt].r)>>1;
	if(pos<=mid){
		return query(lc(rt),pos);
	}else{
		return query(rc(rt),pos);
	}
}

bitset<N>vis;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(LL i=1,u,v;i<n;i++){
		cin>>u>>v;
		g[u].pb(v),g[v].pb(u);
	}
	dfs(1,0);
	build(1,1,n);
	vis[1]=1;
	while(q--){
		char op;LL x;cin>>op>>x;
		if(op=='C'){
			if(vis[x]){
				continue;
			}
			vis[x]=1;
			update(1,dfn[x],dfn[x]+siz[x]-1,{dep[x],x});
		}else{
			cout<<query(1,dfn[x]).second<<"\n";
		}
	}
	return 0;
}
/*

*/

悬2关

2024/9/16 10:31
加载中...