Пример #1
0
    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();
    }