LCT
#include<cstdio> #include<algorithm> using namespace std; int n,m; struct Node{ int rev; Node *ch[2],*fa; Node(Node *fat); void Pushdown(); }*root[10005],*Null; Node::Node(Node *fat){ fa=fat; ch[0]=ch[1]=Null; rev=0; } void Node::Pushdown(){ if(rev){ if(ch[0]!=Null)ch[0]->rev^=1; if(ch[1]!=Null)ch[1]->rev^=1; swap(ch[0],ch[1]); rev=0; } } int Notroot(Node *x){ return (x->fa->ch[0]==x)||(x->fa->ch[1]==x); } void Prepare(Node *x){ if(Notroot(x))Prepare(x->fa); x->Pushdown(); } void Rotate(Node *x,int kind){ Node *y=x->fa,*z=y->fa; y->ch[!kind]=x->ch[kind]; if(x->ch[kind]!=Null)x->ch[kind]->fa=y; x->fa=z; if(Notroot(y))z->ch[z->ch[1]==y]=x; y->fa=x; x->ch[kind]=y; } void Splay(Node *x){ Prepare(x); while(Notroot(x)){ Node *y=x->fa,*z=y->fa; if(!Notroot(y))Rotate(x,y->ch[0]==x); else { if(y->ch[0]==x && z->ch[1]==y){Rotate(x,1);Rotate(x,0);} else if(y->ch[1]==x && z->ch[1]==y){Rotate(y,0);Rotate(x,0);} else if(y->ch[0]==x && z->ch[0]==y){Rotate(y,1);Rotate(x,1);} else {Rotate(x,0);Rotate(x,1);} } } } void Access(Node *x){ for(Node *y=Null;x!=Null;y=x,x=x->fa){Splay(x);x->ch[1]=y;} } void Makeroot(Node *x){ Access(x); Splay(x); x->rev^=1; } void Link(Node *u,Node *v){ Makeroot(u); u->fa=v; } void Cut(Node *u,Node *v){ Makeroot(u); Access(v); Splay(v); if(v->ch[0]==u){v->ch[0]=Null;u->fa=Null;} } Node *Find(Node *x){ Access(x); Splay(x); while(x->ch[0]!=Null)x=x->ch[0]; return x; } Node *GetNull(){ Node *p=new Node(Null); p->ch[0]=p->ch[1]=p->fa=p; p->rev=0; return p; } Node *ToLct(int x){ return root[x]; } int main(){ freopen("2049.in","r",stdin); freopen("2049.out","w",stdout); scanf("%d %d",&n,&m); Null=GetNull(); for(int i=1;i<=n;i++)root[i]=new Node(Null); for(int i=1;i<=m;i++){ int u,v; char s[10]; scanf("%s %d %d",s,&u,&v); if(s[0]=='C')Link(ToLct(u),ToLct(v)); if(s[0]=='D')Cut(ToLct(u),ToLct(v)); if(s[0]=='Q'){ if(Find(ToLct(u))==Find(ToLct(v)))puts("Yes"); else puts("No"); } } return 0; }