记录编号 399691 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2016]tree—增强版 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 6.948 s
提交时间 2017-04-27 13:34:16 内存使用 73.74 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e6+10;
int n,q,w[N*2],head[N],next[N*2];
void add(int f,int t){
	static int cnt=0;
	w[++cnt]=t;
	next[cnt]=head[f];
	head[f]=cnt;
}
int fa[N],s[N],dfn[N],big[N],link[N],pt[N];
void dfs(int x){
	s[x]=1;
	for (int i=head[x];i;i=next[i])
	if (!fa[w[i]]){
		int v=w[i];
		fa[v]=x;
		dfs(v);
		s[x]+=s[v];
		if (s[v]>s[big[x]]) big[x]=v;
	}
}
vector<int> Q[N];int id[N];
void po(int x){
	static int cnt=0;
	pt[dfn[x]=++cnt]=x;
	link[x]=(dfn[x]==dfn[fa[x]]+1?link[fa[x]]:x);
	Q[link[x]].push_back(x);
	id[x]=Q[link[x]].size()-1;
	if (!big[x]) return;
	po(big[x]);
	for (int i=head[x];i;i=next[i])
	if (w[i]!=fa[x]&&w[i]!=big[x]) po(w[i]);
}
int Max[N*4];
#define lc x<<1
#define rc x<<1|1
void paint(int p){
	int x=1,l=1,r=n;
	while (1){
		Max[x]=max(Max[x],p);
		if (l==r) return;
		int mid=(l+r)>>1;
		if (p>mid) x=rc,l=mid+1;else x=lc,r=mid;
	}
}
int find(int x,int l,int r,int L,int R){
	if (l>=L&&r<=R) return Max[x];
	int mid=(l+r)>>1,ans=0;
	if (L<=mid) ans=max(ans,find(lc,l,mid,L,R));
	if (R>mid) ans=max(ans,find(rc,mid+1,r,L,R));
	return ans;
}
bool vis[N];
int query(int x){//O(logn)
	while (!vis[x]) x=fa[link[x]];
	return pt[find(1,1,n,dfn[link[x]],dfn[x])];
}
void color(int p){//O(logn)
	vector<int> &q=Q[link[p]];
	for (int i=id[p];i<q.size();i++){
		int v=q[i];
		if (vis[v]) break;
		vis[v]=1;
	}
	paint(dfn[p]);
}
int read(){
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
void print(int x){
	static char str[20];
	int l=0;
	for (;x;x/=10) str[l++]=x%10;
	while (l) putchar('0'+str[--l]);
	putchar('\n');
}
int main()
{
	freopen("tree++.in","r",stdin);
	freopen("tree++.out","w",stdout);
	int __size__=32<<20;
	char *__p__=(char*)malloc(__size__)+__size__;
	__asm__("movl %0, %%esp\n"::"r"(__p__));
	scanf("%d%d",&n,&q);
	for (int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	fa[1]=1;dfs(1);po(1);color(1);
	while (q--){
		char s=0;
		while (s!='Q'&&s!='C') s=getchar();
		int x=read();
		if (s=='Q') print(query(x));else color(x);
	}
	return 0;
}