思路:
lct模板;
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100005 int n,m,ch[maxn][],f[maxn],st[maxn]; bool rev[maxn]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline bool root(int now)
{
return ch[f[now]][]!=now&&ch[f[now]][]!=now;
} inline void pushdown(int k)
{
int l=ch[k][],r=ch[k][];
if(rev[k])
{
rev[k]^=,rev[l]^=,rev[r]^=;
swap(ch[k][],ch[k][]);
}
} inline void rotate(int now)
{
int fa=f[now],ffa=f[fa],l,r;
l=(ch[fa][]==now),r=l^;
if(!root(fa)) ch[ffa][ch[ffa][]==fa]=now;
f[now]=ffa,f[fa]=now,f[ch[now][r]]=fa;
ch[fa][l]=ch[now][r],ch[now][r]=fa;
} void splay(int now)
{
int top=;st[++top]=now;
for(int i=now;!root(i);i=f[i]) st[++top]=f[i];
for(int i=top;i;i--) pushdown(st[i]);
while(!root(now))
{
int fa=f[now],ffa=f[fa];
if(!root(fa))
{
if((ch[fa][]==now)^(ch[ffa][]==fa)) rotate(now);
else rotate(fa);
}
rotate(now);
}
} void access(int now)
{
for(int i=;now;now=f[now]) splay(now),ch[now][]=i,i=now;
} void rever(int now)
{
access(now),splay(now),rev[now]^=;
} void link(int x,int y)
{
rever(x),f[x]=y,splay(x);
} void cut(int x,int y)
{
rever(x),access(y),splay(y);ch[y][]=f[x]=;
} int find(int now)
{
access(now);splay(now);
int pos=now;
while(ch[pos][]) pos=ch[pos][];
return pos;
} int main()
{
int u,v;char ch[];
in(n),in(m);
for(int i=;i<=m;i++)
{
scanf("%s",ch);in(u),in(v);
if(ch[]=='C') link(u,v);
else if(ch[]=='D') cut(u,v);
else if(find(u)==find(v)) puts("Yes");else puts("No");
}
return ;
}