private static object[] ToTreeObjectWithBalance(ToTreeObjectParams @params, ref int h)
        {
            if (@params.Len == 0)
            {
                return(Empty);
            }
            h++;
            if (@params.Len == 1)
            {
                return new object[]
                       {
                           1, new[]
                           {
                               // запись
                               @params.Elements[@params.Beg], // значение
                               Empty,
                               Empty,
                               0
                           }
                       }
            }
            ;
            int leftH = 0, rightH = 0, l = @params.Len;

            @params.Len /= 2;
            var left = ToTreeObjectWithBalance(@params, ref leftH);

            @params.Beg += @params.Len + 1;
            @params.Len  = l - @params.Len - 1;
            return(new object[]
            {
                1, new[]
                {
                    // запись
                    @params.Elements[@params.Beg + @params.Len / 2], // значение
                    left,
                    ToTreeObjectWithBalance(@params, ref rightH),
                    leftH - rightH
                }
            });
        }
        private object[] ToTreeObject(ToTreeObjectParams @params)
        {
            if (@params.Len == 0)
            {
                return new object[] { Int32.MinValue, new object[] { 0, null } }
            }
            ;
            //if (len == 1)
            //    return new[]
            //    {
            //        // запись
            //        elements[beg], // значение
            //        new object[]{0, null}
            //    };
            int len = @params.Len;

            @params.Len = (int)(@params.Len * 0.5);
            int value = @params.Elements[@params.Len == 0 ? @params.Beg : @params.Beg + @params.Len];

            object[] left = ToTreeObject(new ToTreeObjectParams(@params.Elements, @params.Beg, @params.Len));
            @params.Beg += @params.Len + 1;
            @params.Len  = len - @params.Len - 1;
            return(new object[]
            {
                // запись
                value, // значение
                new object[]
                {
                    1,
                    new object[]
                    {
                        left,
                        ToTreeObject(@params),
                        0
                    }
                }
            });
        }