public void Simple()
        {
            var uf = new PartiallyPersistentUnionFind(2);

            uf.Merge(0, 1).Should().BeTrue();
            uf.Same(0, 1, 0).Should().BeFalse();
            uf.Same(0, 1, 1).Should().BeTrue();
            uf.Size(0, 1).Should().Be(2);
        }
        public void LineReverse()
        {
            int n  = 500000;
            var uf = new PartiallyPersistentUnionFind(n);

            for (int i = n - 2; i >= 0; i--)
            {
                uf.Merge(i, i + 1);
            }
            uf.Version.Should().Be(n - 1);
            uf.Size(0, uf.Version).Should().Be(n);
        }
        public void Line()
        {
            int n  = 500000;
            var uf = new PartiallyPersistentUnionFind(n);

            for (int i = 0; i < n - 1; i++)
            {
                uf.Merge(i, i + 1);
            }
            for (int i = 0; i < n - 1; i++)
            {
                uf.Size(0, i).Should().Be(i + 1);
                uf.Size(i, i).Should().Be(i + 1);
            }
            uf.Version.Should().Be(n - 1);
            uf.Size(0, uf.Version).Should().Be(n);
        }