public static void Main() { Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); int n = NextInt; int q = NextInt; UnionFind uf = new UnionFind(n); DSU dsu = new DSU(n); void VerifyGroup() { var groups = dsu.Groups().ToArray().Select(x => x.OrderBy(x => x).ToArray()).OrderBy(x => x.First()).ToArray(); var ans = Enumerable.Range(0, n).GroupBy(uf.Find).Select(x => x.OrderBy(x => x).ToArray()).OrderBy(x => x.First()).ToArray(); if (groups.Length != ans.Length) { throw new Exception(); } if (groups.Zip(ans, (x, y) => x.SequenceEqual(y)).Any(x => !x)) { throw new Exception(); } } for (int i = 0; i < q; i++) { var(t, u, v) = (NextInt, NextInt, NextInt); if (t == 0) { dsu.Merge(u, v); uf.TryUnite(u, v); } else { Console.WriteLine(dsu.Same(u, v) ? "1" : "0"); } if ((i & -i) == 0) { VerifyGroup(); } } VerifyGroup(); Console.Out.Flush(); }