Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

You are given $n$ packages of $w_i$ kg from a belt conveyor in order ($i = 0, 1, ... n-1$). You should load all packages onto $k$ trucks which have the common maximum load $P$. Each truck can load consecutive packages (more than or equals to zero) from the belt conveyor unless the total weights of the packages in the sequence does not exceed the maximum load $P$.

Write a program which reads $n$, $k$ and $w_i$, and reports the minimum value of the maximum load $P$ to load all packages from the belt conveyor.

Input

In the first line, two integers $n$ and $k$ are given separated by a space character. In the following $n$ lines, $w_i$ are given respectively.

Output

Print the minimum value of $P$ in a line.

Constraints

$1 \leq n \leq 100,000$

$1 \leq k \leq 100,000$

$1 \leq w_i \leq 10,000$

Sample Input 1

5 3
8
1
7
3
9

Sample Output 1

10

If the first truck loads two packages of $\{8, 1\}$, the second truck loads two packages of $\{7, 3\}$ and the third truck loads a package of $\{9\}$, then the minimum value of the maximum load $P$ shall be 10.

Sample Input 2

4 2
1
2
2
6

Sample Output 2

6

If the first truck loads three packages of $\{1, 2, 2\}$ and the second truck loads a package of $\{6\}$, then the minimum value of the maximum load $P$ shall be 6.

Solution in Ruby (judge verdict: Accepted)

@pak_num_n, @trk_num_k = gets.split.map(&:to_i)
@pak_weight = readlines(chomp: true).map(&:to_i)

def check(max_sum_wgt_p) # 仮定した最大積載量で、トラックに積み込めるかチェック
  pak_w_idx = 0 # 加算する荷物の重さインデックス

  @trk_num_k.times do | truck | # トラックの数、次のトラックへ
    sum_wgt = 0
    # 仮定した最大積載量より、合計した荷物の重さが、小さい場合、繰り返す。大きい場合積み込めないので次のトラックへ
    while (sum_wgt += @pak_weight[pak_w_idx]) <= max_sum_wgt_p

      pak_w_idx += 1 # 加算する荷物の重さインデックスを一つ進める
      # 荷物の重さインデックスが、荷物の個数と同じになった場合
      if pak_w_idx == @pak_num_n
        return @pak_num_n # 荷物をすべて積み込めたとみなして荷物の個数を返す
      end
    end
  end
  pak_w_idx # 積み込めなかった場合、限界まで積み込めた個数を返す
end

def slove()
  left = 0 # 二分探索で使う左
  right = 100_000 * 10_000 # 荷物の数 * 荷物の重さ = 最大積載量を仮定
  # right = 30
  
  while (right - left) > 1 
    mid = (left +  right) / 2 # 中央値を決める
    stk_pak_num_v = check(mid) # 最大積載量を中央値で仮定し、チェックした後、個数を

    if stk_pak_num_v >= @pak_num_n # 仮定した最大積載量で積み込めた荷物の個数が、荷物の個数以上の場合
      right = mid # 仮定する最大積載量を小さくしていく
    else
      left = mid # 仮定した最大積載量で積み込めた無かった場合、仮定する最大積載量を大きくしていく
    end
  end
  right
end

puts slove()