![]()
#include<iostream>
using namespace std;
const int N = 100010;
int n,m;
int p[N];
int cnt[N];
//带路径压缩的查找函数
int find(int x){
if(p[x]!=x){
p[x] = find(p[x]);
}
return p[x];
}
//维护了并查集大小的合并操作
int merge(int x,int y){
//一定要先维护cnt[],再进行合并
cnt[find(y)] += cnt[find(x)];
p[find(x)] = find(y);
}
int main(){
cin>>n>>m;
for(int i = 0 ;i <= n ;i++){
p[i] = i;
cnt[i] = 1;
}
string ch;
int a,b,c;
for(int i = 0 ;i < m ; i ++){
cin>>ch;
if(ch=="C"){
cin>>a>>b;
//要先判断这两个是否已经在同一个集合中了,再合并,否则维护的cnt数组会出错
if(find(a) != find(b)) merge(a,b);
}
if(ch=="Q1"){
cin>>a>>b;
if(find(a) == find(b)) puts("Yes");
else puts("No");
}
if(ch=="Q2"){
cin>>a;
a = find(a);
cout<<cnt[a]<<endl;
}
}
return 0;
}