1 #include <stdio.h>
2 #include <string.h>
3 #define MAX 100002
4 int diset[MAX];
5 int buf[MAX],bufend=-1;
6 int group;
7 int n;
8 int tohead(int a){
9 int i,head=-1;
10 for(i=a ; diset[i]!=i ; i=diset[i]){
11 head=diset[i];
12 bufend++;
13 buf[bufend]=i;
14 }
15 for(; bufend >=0 ; bufend--){
16 diset[buf[bufend]]=head;
17 }
18 if(head==-1) return a;
19 return head;
20 }
21 void attach(int a,int b){
22 int aa,bb;
23 aa=tohead(a);
24 bb=tohead(b);
25 diset[aa]=bb;
26 tohead(a);
27 if(aa != bb){
28 group--;
29 }
30 }
31 void query(int a,int b){
32 if(tohead(a) == tohead(b)){
33 puts("Yes");
34 }else{
35 puts("No");
36 }
37 }
38 int main(){
39 int m,i;
40 int a,b,c;
41 scanf("%d %d",&n,&m);
42 for(i=1;i<=n;i++){
43 diset[i]=i;
44 }
45 group=n;
46 while(1){
47 scanf("%d %d %d",&a,&b,&c);
48 if(a==0 && b==0 && c==0){
49 printf("%d\n",group);
50 return 0;
51 }
52 switch(a){
53 case 1:
54 attach(b,c);
55 break;
56 case 2:
57 query(b,c);
58 break;
59 case 3:
60 printf("%d\n",group);
61 }
62 }
63 return 0;
64 }