8pts球调
查看原帖
8pts球调
383889
j1ANGFeng楼主2022/11/10 20:22
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#define ll long long
#define N 10000001
#define inf 2147483647
#define in inline
#define re register
#define debug putchar('1');
using namespace std;
inline int rd(){char a=getchar();int f=1,x=0;while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}while(a>='0'&&a<='9'){x=(x<<3)+(x<<1)+(long(a^48));a=getchar();}return f*x;}void qwqqwq(ll x){if(x!=0){qwqqwq(x/10);putchar(x%10^48);}return;}in void wt(ll x){if(x==0){putchar('0');return;}if(x<0){x=-x;putchar('-');}qwqqwq(x);return;}in ll max(ll a,ll b){return a>b?a:b;}in ll min(ll a,ll b){return a>b?b:a;}in ll abs(ll a){return a<0?-a:a;}in void swap(ll &a,ll &b){a^=b;b^=a;a^=b;}
struct node{
	int nxt,to;
}edge[N];
struct tree{
	int l,r,w;
}t[N];
int h[N],cnt,dep[N],si[N],f[N],son[N],top[N],id[N],val[N],tot;
in void add(int u,int v){
	edge[cnt].to=v;
	edge[cnt].nxt=h[u];
	h[u]=cnt++;
	return;
}
void build(int i,int l,int r){
	t[i].l=l;
	t[i].r=r;
	t[i].w=-1;
	if(l==r)
	  return;
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	return;
}
void up(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		t[i].w=l;
		return;
	}
	if(t[i<<1].r>l)
	  up(i<<1,l,r);
	if(t[i<<1|1].l<=r)
	  up(i<<1|1,l,r);
	t[i].w=max(t[i<<1].w,t[i<<1|1].w);
	return;
}
int qu(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r)
	  return t[i].w;
	int ans=0;
	if(t[i<<1].r>l)
	  ans=qu(i<<1,l,r);
	if(t[i<<1|1].l<=r)
	  ans=max(ans,qu(i<<1|1,l,r));
	return ans;
}
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u]=fa;
	si[u]=1;
	int maxn=-inf;
	for(re int i=h[u];i;i=edge[i].nxt){
		int t=edge[i].to;
		if(t==f[u])
		  continue;
		dfs1(t,u);
		si[u]+=si[t];
		if(si[u]>maxn){
			son[u]=t;
			maxn=si[t];
		}
	}
	return;
}
void dfs2(int u,int tp){
	id[u]=++tot;
	val[tot]=u;
	top[u]=tp;
	if(!son[u])
	  return;
	dfs2(son[u],tp);
	for(re int i=h[u];i;i=edge[i].nxt){
		int t=edge[i].to;
		if(t==f[u]||t==son[u])
		  continue;
		dfs2(u,u);
	}
	return;
}
void up1(int x){
	up(1,id[x],id[x+1]);
	return;
}
int qu1(int x,int y){
	int ans=-1;
	while(top[x]!=top[y]){
		if(dep[id[x]]<dep[id[y]])
		  swap(x,y);
		ans=qu(1,id[top[x]],id[x]+1);
		if(ans!=-1)
		  return val[ans];
		x=f[top[x]];
	}
	if(dep[x]>dep[y])
	  swap(x,y);
	ans=qu(1,id[x],id[y]+1);
	return val[ans];
}
signed main(){
	int n=rd(),q=rd()+1;
	for(re int i=1;i<n;++i){
		int u=rd(),v=rd();
		add(u,v),add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n+1);
	up(1,1,2);
	while(--q){
		char ch=getchar();
		while(ch!='C'&&ch!='Q')
		  ch=getchar();
		int x=rd();
		if(ch=='C')
		  up1(x);
		else wt(qu1(x,1)),putchar('\n');
	}
	return 0;
}

AC#11

2022/11/10 20:22
加载中...