This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM \
"https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/all/DSL_1_A"
#include <iostream>
#include "../macros.hpp"
#include "../structure/unionFind.hpp"
using namespace std;
int main() {
int n, q;
cin >> n >> q;
UnionFind uf(n);
rep(i, q) {
int com, x, y;
cin >> com >> x >> y;
if (com == 0) {
uf.unite(x, y);
} else if (com == 1) {
cout << uf.same(x, y) << endl;
}
}
return 0;
}#line 1 "test/union_find.aoj.test.cpp"
#define PROBLEM \
"https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/all/DSL_1_A"
#include <iostream>
#line 2 "macros.hpp"
#define rep(i, n) for (int i = 0; i < (n); i++)
#line 2 "structure/unionFind.hpp"
#include <algorithm>
#include <vector>
struct UnionFind {
std::vector<int> data;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, -1) {}
bool unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return false;
if (data[a] < data[b]) std::swap(a, b);
data[a] += data[b];
data[b] = a;
return true;
}
int find(int a) {
if (data[a] < 0) return a;
return data[a] = find(data[a]);
}
int same(int a, int b) { return find(a) == find(b); }
int size(int k) { return -data[find(k)]; }
std::vector<std::vector<int>> groups() {
int n = (int)data.size();
std::vector<std::vector<int>> ret(n);
for (int i = 0; i < n; i++) {
ret[find(i)].emplace_back(i);
}
ret.erase(std::remove_if(std::begin(ret), std::end(ret),
[&](const std::vector<int>& v) { return v.empty(); }),
std::end(ret));
return ret;
}
};
#line 7 "test/union_find.aoj.test.cpp"
using namespace std;
int main() {
int n, q;
cin >> n >> q;
UnionFind uf(n);
rep(i, q) {
int com, x, y;
cin >> com >> x >> y;
if (com == 0) {
uf.unite(x, y);
} else if (com == 1) {
cout << uf.same(x, y) << endl;
}
}
return 0;
}