一、初始化
void init() {
for (int i=1; i<=n; i++) {
fa[i] = i;
size[i] = 1;
}
}
二、找祖源
int find(int x) {
if(fa[x]==x) return x;
else return fa[x] = find(fa[x]);
}
三、合并连通块
void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;
size[y] += size[x];
}
四、询问是否连通
bool ask(int a,int b) {
return find(a)==find(b);
}
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int p[N],cnt[N];
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
int main(){
cin>>n>>m;
//cnt[i]表示编号为i的集合的元素的数量
for(int i=1;i<=n;i++){
p[i]=i;
cnt[i]=1;
}
while(m--){
string op;
int a,b;
cin>>op;
if(op=="C"){
cin>>a>>b;
a=find(a),b=find(b);
if(a!=b){
p[a]=b;
//维护cnt
cnt[b]+=cnt[a];
}
}
else if(op=="Q1"){
cin>>a>>b;
if(find(a)==find(b))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else{
cin>>a;
cout<<cnt[find(a)]<<endl;
}
}
return 0;
}