记录编号 466751 评测结果 EEEEEEEEEE
题目名称 艺术 最终得分 0
用户昵称 GravatarBaDBoY 是否通过 未通过
代码语言 C++ 运行时间 0.755 s
提交时间 2017-10-29 16:30:27 内存使用 28.36 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define mid (l+r>>1)
char buf[300005*30], *ptr=buf-1;
inline int read(){
    register int x=0,f=1,c=*++ptr;
    while (c<48) c=='-'&&(f=-1),c=*++ptr;
    while (c>47) x=x*10+c-48,c=*++ptr;
    return x * f;
}
int n,m,war,whi[300005],tot,r[300005];
struct EDGE{int to,next;} c[600005];
void add(int x,int y) {
	c[++tot]=(EDGE){y,r[x]};
	r[x]=tot;
}
int fa[300005],son[300005],size[300005],dep[300005];
inline void dfs1(int u){
	size[u]=1;son[u]=0;
	for(int i=r[u]; ~i; i=c[i].next){
		int to=c[i].to;
		if(to==fa[u])continue;
		fa[to]=u;dep[to]=dep[u]+1;dfs1(to);
		size[u]+=size[to];if(size[to]>size[son[u]])son[u]=to;
	}
}
int cnt,top[300005],id[300005],pos[300005];
inline void dfs2(int u,int rt){
	top[u]=rt;id[u]=++cnt;pos[cnt]=u;if(son[u])dfs2(son[u],rt);
	for(int i=r[u]; ~i; i=c[i].next){int to=c[i].to; if(to==fa[u]||to==son[u]) continue; dfs2(to,to);}
}
int sum[1200005];
inline void pushup(int i){sum[i]=sum[i<<1]+sum[i<<1|1];}
inline void update(int pos,int w,int l,int r,int i){
	if(l==r){sum[i]+=w;return;}
	if(pos<=mid)update(pos,w,l,mid,i<<1); else update(pos,w,mid+1,r,i<<1|1); pushup(i);
}
inline int query(int ll,int rr,int l,int r,int i){
	if(ll<=l&&r<=rr)return sum[i];int ret=0;
	if(ll<=mid)ret+=query(ll,rr,l,mid,i<<1);if(mid<rr)ret+=query(ll,rr,mid+1,r,i<<1|1);return ret;
}
inline bool check(int x,int y){
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		if(query(id[top[x]],id[x],1,n,1)>0)return false;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	if(id[x]^id[y])return query(id[x]+1,id[y],1,n,1)<=0;
	else return true;
}
char op[5];
int Main(){
	freopen("lct.in","r",stdin);
	freopen("lct.out","w",stdout);
	fread(buf,1,sizeof(buf),stdin);
	memset(r,0xff,sizeof(r));
	n=read(),m=read();for(int i=1;i<n;++i){int x=read(),y=read();add(x,y);add(y,x);}
	dfs1(1);dfs2(1,1);
	while(m--){
		scanf("%s",op);
		if(op[0]=='Q'){int x(read()),y(read());if(check(x,y))puts("Yes");else puts("No");}
		if(op[0]=='C'){int x(read()),y(read()),tmp(dep[x]>dep[y]?x:y);whi[++war]=tmp;update(id[tmp],1,1,n,1);}
		if(op[0]=='U'){int x(read());update(id[whi[x]],-1,1,n,1);}
	}
}
int hehe=Main();
int main(){;}