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)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AOJ.Codes
{
    //問題の名称... DSL_1_A:   Disjoint Set: Union Find Tree
    //問題文のURL... http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_1_A&lang=jp
    //所要時間... AAA
    //学んだこと... AAA
    //教室内の大まかな着席位置... 左 x 奥

    class UnionFindTree
    {
        static void Main(string[] args)
        {

            //読み込み
            var x1 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var n = x1[0];
            var q = x1[1];

            var input = new List<int[]>();

            for (int i = 0; i < q; i++)
            {
                var x2 = Console.ReadLine().Split().Select(int.Parse).ToArray();
                input.Add(x2);
            }

            //計算
            var P = new int[n];
            for (int i = 0; i < n; i++) P[i] = i;

            var ans = new List<bool>();

            foreach (var item in input)
            {
                var com = item[0];
                var x = item[1];
                var y = item[2];

                if (com == 0)
                {
                    //unite
                    var rx = GetRoot(x, P);
                    var ry = GetRoot(y, P);
                    P[rx] = ry;
                }
                else
                {
                    //same
                    ans.Add(GetRoot(x, P) == GetRoot(y, P));
                }
            }

            //出力
            foreach (var item in ans)
                Console.WriteLine(item ? 1 : 0);



            //Enterを押して終了
            Console.ReadLine();
        }

        static private int GetRoot(int i, int[] P)
        {
            while (true)
            {
                if (P[i] == i)
                    return i;
                else
                    i = P[i];
            }
        }
    }
}