#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 2000010
int n,m;
int size[N],fa[N],tag[N],st[N];
int child[N][2];
void update(int x)//
{
size[x]=size[child[x][0]]+size[child[x][1]]+1;
}
bool isroot(int x)//
{
return (!fa[x]||(child[fa[x]][0]!=x&&child[fa[x]][1]!=x));
}
void zig(int x)//
{
int y=fa[x];
fa[x]=fa[y];
if(!isroot(y)) child[fa[x]][child[fa[x]][1]==y]=x;
child[y][0]=child[x][1];
fa[child[x][1]]=y;
child[x][1]=y; fa[y]=x;
update(y); update(x);
}
void zag(int x)//
{
int y=fa[x];
fa[x]=fa[y];
if(!isroot(y)) child[fa[x]][child[fa[x]][1]==y]=x;
child[y][1]=child[x][0];
fa[child[x][0]]=y;
child[x][0]=y; fa[y]=x;
update(y); update(x);
}
void pushdown(int x)//
{
if(!tag[x]) return;
tag[x]^=1;
swap(child[x][0],child[x][1]);
tag[child[x][0]]^=1;
tag[child[x][1]]^=1;
}
void splay(int x)//
{
int top=0; st[++top]=x;
for(int y=x;!isroot(y);y=fa[y]) st[++top]=fa[y];
for(int i=top;i;i--) pushdown(st[i]);
while(!isroot(x))
{
int y=fa[x],z=fa[y];
if(isroot(y))
{
child[y][0]==x?zig(x):zag(x); break;
}
child[y][0]==x?zig(x):zag(x);
child[z][0]==x?zig(x):zag(x);
}
}
void access(int x)
{
for(int t=0;x;t=x,x=fa[x])
{
splay(x);
child[x][1]=t;
}
}
void rever(int x)
{
access(x); splay(x); tag[x]^=1;
}
void link(int x,int y)
{
rever(x); fa[x]=y;
}
void cut(int x,int y)
{
rever(x); access(y); splay(y); fa[x]=child[y][0]=0;
}
int find(int x)
{
access(x); splay(x);
for(;child[x][0];x=child[x][0]);
return x;
}
bool query(int x,int y)
{
return find(x)==find(y);
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
char s[10]; int u,v; scanf("%s%d%d",s,&u,&v);
if(s[0]==‘Q‘)
{
if(query(u,v)) printf("Yes\n"); else printf("No\n");
}
if(s[0]==‘C‘) link(u,v);
if(s[0]==‘D‘) cut(u,v);
}
return 0;
}