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 Go (judge verdict: Accepted)

package main

import (
        "fmt"
        "bufio"
        "os"
        "strings"
        "strconv"
)

var (
        qset []int
        nline int
)

func main(){
        fmt.Scan(&nline)

        qset= make([]int, nline)

        for i := 0; i < nline; i++ {
                qset[i] = i
        }

        // exec Unite set, manipulate query set
        execUniteData()
}

func execUniteData(){
        scanner := bufio.NewScanner(os.Stdin)

        for scanner.Scan(){
                lineArgs := strings.Fields(scanner.Text())
                if len(lineArgs) == 3 {
                        setquery(lineArgs)
                }
        }
}

func setquery(args []string){
        w, _ := strconv.Atoi(args[0])
        x, _ := strconv.Atoi(args[1])
        y, _ := strconv.Atoi(args[2])
        x,y = numCompare(qset[x],qset[y])

        if w == 0 { // manipulate query set
                for i:=0;i<nline;i++ {
                        if qset[i] == y {
                                qset[i] = x
                        }
                }
        }else{ // print
                if qset[x]==qset[y]{
                        fmt.Println(1)
                }else{
                        fmt.Println(0)
                }
        }
}

func numCompare(a int, b int)(int,int){
        if a>b {
                return b, a
        }else{
                return a, b
        }
}