#define PROBLEM "https://judge.yosupo.jp/problem/unionfind"
#include"../../src/alfred/config/io-sync-off.hpp"
#include"../../src/alfred/data_structure/dsu.hpp"
#include<iostream>intmain(intargc,charconst*argv[]){intn,q,opt,u,v;optimizeIO(),std::cin>>n>>q;DSUD(n);while(q--){std::cin>>opt>>u>>v;if(opt==0){D.merge(u,v);}else{std::cout<<D.same(u,v)<<'\n';}}return0;}
#line 1 "verify/verify-yosupo-ds/yosupo-unionfind.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/unionfind"
#line 1 "src/alfred/config/io-sync-off.hpp"
#include<bits/stdc++.h>inlinevoidoptimizeIO(void){std::ios::sync_with_stdio(false);std::cin.tie(NULL),std::cout.tie(NULL);}#line 1 "src/alfred/data_structure/dsu.hpp"
#line 6 "src/alfred/data_structure/dsu.hpp"
structDSU{std::vector<int>fa,siz;DSU(intn):fa(n+1),siz(n+1,1){std::iota(fa.begin(),fa.end(),0);}inlineintfind(intx){returnfa[x]==x?x:fa[x]=find(fa[x]);}inlineboolsame(intx,inty){returnfind(x)==find(y);}// true if x and y were not in the same set, false otherwise.inlineboolmerge(intx,inty){intfx=find(x),fy=find(y);if(fx==fy)returnfalse;if(siz[fx]<siz[fy])std::swap(fx,fy);fa[fy]=fx,siz[fx]+=siz[fy],siz[fy]=0;returntrue;}// x -> y, a.k.a let x be son of y (disable merge by rank).inlinebooldirected_merge(intx,inty){intfx=find(x),fy=find(y);if(fx==fy)returnfalse;fa[fx]=fy,siz[fy]+=siz[fx],siz[fx]=0;returntrue;}};#line 6 "verify/verify-yosupo-ds/yosupo-unionfind.test.cpp"
intmain(intargc,charconst*argv[]){intn,q,opt,u,v;optimizeIO(),std::cin>>n>>q;DSUD(n);while(q--){std::cin>>opt>>u>>v;if(opt==0){D.merge(u,v);}else{std::cout<<D.same(u,v)<<'\n';}}return0;}