我的马:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#define rep(i,a,b) for(register int i=a;i<=b;++i)
#define rev(i,a,b) for(register int i=a;i>=b;--i)
#define gra(i,u) for(register int i=head[u];i;i=edge[i].nxt)
#define Inf(a) memset(a,0x3f,sizeof(a))
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0' or ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' and ch<='9')s=s*10+(ch-'0'),ch=getchar();
return s*w;
}
const int INF=1e9+10;
template<typename T>
inline T Max(T x,T y){return x>y?x:y;}
template<typename T>
inline T Min(T x,T y){return x<y?x:y;}
template<typename T>
inline void Swap(T&x,T&y){T t=x;x=y;y=t;return;}
template<typename T>
inline T Abs(T x){return x>0?x:-x;}
const int MAXN(10010);
int n,m;
struct Union_Find_Set
{
int par[MAXN];
inline void connect(int u,int v){par[u]=v;return;}
inline void destroy(int u,int v){par[v]=0;return;}
inline bool query(int u,int v){while(v!=u&&v) v=par[v];return v==u;}
inline void rotate(int u)
{
int lst(0);
while(u)
{
int fa=par[u];
par[u]=lst;
lst=u;
u=fa;
}
return;
}
inline void init_(){rep(i,0,n) par[i]=i;return;}
};
Union_Find_Set dsu;
int main()
{
n=read(),m=read();
while(m--)
{
char opt[10];
scanf("%s",opt);
int v=read(),u=read();
dsu.rotate(u);
if(opt[0]=='C') dsu.connect(u,v);
else if(opt[0]=='D') dsu.destroy(u,v);
else if(dsu.query(u,v)) puts("Yes");
else puts("No");
}
return 0;
}
最后一个点被卡 T 了。