1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX 100002
 4 int diset[MAX];
 5 int buf[MAX],bufend=-1; /* 記錄要修改的點的 stack,開大一點沒關係 */
 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; /* m 是擺好看的 */
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 }