This documentation is automatically generated by online-judge-tools/verification-helper
// verification-helper: PROBLEM https://judge.yosupo.jp/problem/unionfind
#include<bits/stdc++.h>
using namespace std;
#define call_from_test
#include "../../datastructure/unionfind.cpp"
#undef call_from_test
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
const char newl = '\n';
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==0) uf.unite(u,v);
if(t==1) cout<<uf.same(u,v)<<newl;
}
return 0;
}
#line 1 "test/yosupo/unionfind.test.cpp"
// verification-helper: PROBLEM https://judge.yosupo.jp/problem/unionfind
#include<bits/stdc++.h>
using namespace std;
#define call_from_test
#line 1 "datastructure/unionfind.cpp"
#line 3 "datastructure/unionfind.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
struct UnionFind{
int num;
vector<int> rs,ps;
UnionFind(int n):num(n),rs(n,1),ps(n,0){
iota(ps.begin(),ps.end(),0);
}
int find(int x){
return (x==ps[x]?x:ps[x]=find(ps[x]));
}
bool same(int x,int y){
return find(x)==find(y);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y) return;
if(rs[x]<rs[y]) swap(x,y);
rs[x]+=rs[y];
ps[y]=x;
num--;
}
int size(int x){
return rs[find(x)];
}
int count() const{
return num;
}
};
//END CUT HERE
#ifndef call_from_test
//INSERT ABOVE HERE
signed main(){
return 0;
}
#endif
#line 8 "test/yosupo/unionfind.test.cpp"
#undef call_from_test
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
const char newl = '\n';
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==0) uf.unite(u,v);
if(t==1) cout<<uf.same(u,v)<<newl;
}
return 0;
}