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

function Main(input) {
    var arr = input.split("\n");
    var nums = arr[0].split(" ");
    var n = parseInt(nums[0], 10);
    var q = parseInt(nums[1], 10);
    var set = new Array();
    for (i = 0; i < n; i++) {
        set.push(new UnionFind());
    }
    var uf = new UnionFind();
    for (i = 0; i < q; i++) {
        var command = arr[i + 1].split(" ");
        var a = parseInt(command[1], 10);
        var b = parseInt(command[2], 10);
        if (command[0] == "0") {    
            uf.unite(set[a], set[b]);
        } else {
            console.log(uf.same(set[a], set[b]));
        }
    }
}

function UnionFind() {
    this.parent = this;
    this.size = 1;
    this.find = function(){
        if (this.parent == this) {
            return this;
        } else {
            return this.parent.find();
        }
    };
    this.unite = function(x, y) {
        var xtop = x.find();
        var ytop = y.find();
        if (xtop == ytop) {
            return false;
        } else {
            if (xtop.size < ytop.size) {
                xtop.parent = ytop;
                ytop.size += xtop.size;
            } else {
                ytop.parent = xtop;
                xtop.size += ytop.size;
            }
            return true;
        }
    };
    this.same = function(x, y) {
        if (x.find() == y.find()) {
            return 1;
        } else {
            return 0;
        }
    };
}

Main(require("fs").readFileSync("/dev/stdin", "utf8"));