Problem:
Disjoint Set

Write a program which manipulates a disjoint set S = {S1, S2, . . . , Sk}.

First of all, the program should read an integer n, then make a disjoint set where each element consists of 0, 1, ... n−1 respectively.

Next, the program should read an integer q and manipulate the set for q queries. There are two kinds of queries for different operations:

unite(x, y): unites sets that contain x and y, say Sx and Sy, into a new set.

same(x, y): determine whether x and y are in the same set.

Input

n q
com1 x1 y1
com2 x2 y2
...
comq xq yq

In the first line, n and q are given. Then, q queries are given where com represents the type of queries. '0' denotes unite and '1' denotes same operation.

Output

For each same operation, print 1 if x and y are in the same set, otherwise 0, in a line.

Constraints

1 ≤ n ≤ 10000

1 ≤ q ≤ 100000

x ≠ y

Sample Input

5 12
0 1 4
0 2 3
1 1 2
1 3 4
1 1 4
1 3 2
0 1 3
1 2 4
1 3 0
0 0 4
1 0 2
1 3 0

Sample Output

0
0
1
1
1
0
1
1

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#define MAX 10001

 int par[MAX],rank[MAX];

 void init(int n){
           int i;
           for(i=0;i<n;i++){
                       par[i]=i;
                       rank[i]=0;
                       }
           }

 int find(x){
         if(par[x]==x){
                   return x;
                   }
         else {
               return par[x]=find(par[x]);
               }
         }

 int unite(int x,int y){
               x=find(x);
               y=find(y);

               if(x==y)return;

               if(rank[x]<rank[y]){par[x]=y;}
               else {
                     par[y]=x;
                     if(rank[x]==rank[y]){rank[x]++;}
                     }
               }


 int same(int x,int y){return find(x)==find(y);}

 int main(){
        int n,q,com,i,x,y;
        scanf("%d%d",&n,&q);
        init(n);
        for(i=0;i<q;i++){
                    scanf("%d%d%d",&com,&x,&y);

                    if(com==0){unite(x,y);}
                    else 
                          {if(same(x,y)){printf("1\n");}
                           else {printf("0\n");}
                          }
                    }
        return 0;
        }