public void One()
        {
            var s = new Segtree <string, MonoidOperator>(1);

            s.AllProd.Should().Be("$");
            s[0].Should().Be("$");
            s.Prod(0, 1).Should().Be(s[0..1]).And.Be("$");
        public void Invalid()
        {
            var s = new Segtree <string, MonoidOperator>(10);

            s.Invoking(s => s[-1]).Should().ThrowContractAssert();
            s.Invoking(s => s[10]).Should().ThrowContractAssert();
            s.Invoking(s => s[0]).Should().NotThrow();
            s.Invoking(s => s[9]).Should().NotThrow();

            s.Invoking(s => s.Prod(-1, -1)).Should().ThrowContractAssert();
            s.Invoking(s => s.Prod(3, 2)).Should().ThrowContractAssert();
            s.Invoking(s => s.Prod(0, 11)).Should().ThrowContractAssert();
            s.Invoking(s => s.Prod(-1, 11)).Should().ThrowContractAssert();
            s.Invoking(s => s.Prod(0, 0)).Should().NotThrow();
            s.Invoking(s => s.Prod(10, 10)).Should().NotThrow();
            s.Invoking(s => s.Prod(0, 10)).Should().NotThrow();

            s.Invoking(s => s.MaxRight(11, s => true)).Should().ThrowContractAssert();
            s.Invoking(s => s.MaxRight(-1, s => true)).Should().ThrowContractAssert();
            s.Invoking(s => s.MaxRight(0, s => false)).Should().ThrowContractAssert();
            s.Invoking(s => s.MaxRight(0, s => true)).Should().NotThrow();
            s.Invoking(s => s.MaxRight(10, s => true)).Should().NotThrow();

            s.Invoking(s => s.MinLeft(11, s => true)).Should().ThrowContractAssert();
            s.Invoking(s => s.MinLeft(-1, s => true)).Should().ThrowContractAssert();
            s.Invoking(s => s.MinLeft(0, s => false)).Should().ThrowContractAssert();
            s.Invoking(s => s.MinLeft(0, s => true)).Should().NotThrow();
            s.Invoking(s => s.MinLeft(10, s => true)).Should().NotThrow();
        }