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>
#include<iostream>
#include<fstream>
#include<string>
#include<math.h>
#include <set>
#include <list>
using namespace std;

enum command {
	unite = 0,
	same = 1
};
void set_print(const char* msg, const set<int> &s)
{
	cout << msg;
	cout << " " << s.size() << " [";
	const char * delim = "";
	for (set<int>::iterator it = s.begin(); it != s.end(); ++it)
	{
		int c = *it;
		cout << delim << (int)c;
		delim = ",";
	}
	cout << " ]" << endl;
}
int main(){
		std::istream & c_in = cin;
	int n, q;
	c_in >> n >> q;
	typedef list< set<int> > SETS;
	SETS sets;
	for (int i = 0; i < n; ++i)
	{
		set<int> s;
		s.insert(i);
		sets.push_back(s);
	}

	for (int i = 0; i < q; ++i)
	{
		int com, x, y;
		c_in >> com >> x >> y;
		if (com == unite)
		{
			//unite(x,y): x ??????????????? Sx ??¨ y ??????????????? Sy ??????????????????
			SETS::iterator sx = sets.end(), sy = sets.end();
			for (SETS::iterator it = sets.begin(); it != sets.end() && (sx == sets.end() || sy == sets.end()); ++it)
			{
				if (it->find(x) != it->end())
				{
					sx = it;
				}
				if (it->find(y) != it->end())
				{
					sy = it;
				}
			}
			if (sx != sy)
			{
				sx->insert(sy->begin(), sy->end());
				//{
				//	set_print("sx=", *sx);
				//	set_print("sy=", *sy);
				//}
				sets.remove(*sy);
			}
		}
		else if (com == same)
		{
			for (SETS::iterator it = sets.begin(); it != sets.end(); ++it)
			{
				bool notfindx = it->find(x) == it->end();
				bool notfindy = it->find(y) == it->end();

				if (notfindx && notfindy)
				{
					continue;
				}
				int v = (!notfindx) && (!notfindy) ? 1 : 0;
				cout << v << endl;
				break;
			}

		}
	}
}