#4406. 积木 (block)

积木 (block)

[丛雨]用积木搭出了一个宽度为 nn 的大厦,但糟糕的没有所有列的高度都一致,如下图所示(每块积木都是 1111*1*1 的正方体)

现在你需要做的是,尽可能多地往上叠积木,但是当你添加积木时必须满足以下条件:如果要在某一个位置上放一个积木,必须满足它的左下、下方、右下都有积木(用二维坐标 aa 表示,如果要在 a[i,j]a[i,j] 位置放积木,那么 a[i1,j1]a[i-1,j-1]a[i,j1]a[i,j-1]a[i+1,j1]a[i+1,j-1] 必须要有积木)。提供给你的积木有 mm 块,大厦当然搭得越高越好,请问最高能到多少呢?

输入格式(block.in)

第一行两个用空格隔开的整数 nnmm ,分别表示己搭好的宽度和可以使用的积木数量。 后面有 nn 行,每行一个整数 hih_i 表示己搭建的第 ii 列积木的高度。

输出格式(block.out)

一个整数,表示能搭建的最大高度。

输入样例

8 4
3
4
2
1
3
3
2
4

输出样例

5

数据范围

对于 30%30\% 的数据,满足 n10,m1000n \le 10, m \le 1000 。 对于 50%50\% 的数据,满足 n100,m1000000n \le 100, m \le 1000000 。 对于 70%70\% 的数据,满足 n1000,m10000000n \le 1000, m \le 10000000 。 对于 80%80\% 的数据,满足 n10000,m100000000n \le 10000, m \le 100000000 。 对于 100%100\% 的数据,满足 n100000,m1000000000n \le 100000, m \le 1000000000