This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://judge.yosupo.jp/problem/unionfind"
#include <bits/stdc++.h>
using namespace std;
#include "../data-structure/union-find.cpp"
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n, q;
cin >> n >> q;
UnionFind uf(n);
for(int i = 0; i < q; i++) {
int t, u, v;
cin >> t >> u >> v;
if(t)
cout << uf.same(u, v) << "\n";
else
uf.unite(u, v);
}
return 0;
}
#line 1 "test/yosupo-Unionfind.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/unionfind"
#include <bits/stdc++.h>
using namespace std;
#line 3 "data-structure/union-find.cpp"
using namespace std;
struct UnionFind {
vector<int> data;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, -1) {}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return false;
if(data[x] > data[y]) swap(x, y);
data[x] += data[y];
data[y] = x;
return true;
}
int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); }
int size(int x) { return -data[x]; }
bool same(int x, int y) { return find(x) == find(y); }
};
/*
* @brief Union-Find
* @docs docs/union-find.md
*/
#line 7 "test/yosupo-Unionfind.test.cpp"
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n, q;
cin >> n >> q;
UnionFind uf(n);
for(int i = 0; i < q; i++) {
int t, u, v;
cin >> t >> u >> v;
if(t)
cout << uf.same(u, v) << "\n";
else
uf.unite(u, v);
}
return 0;
}