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 C# (judge verdict: Accepted)

//割り当て//2863266を参考
using System;
using System.Linq; //max sum


namespace tst
{
    class Program
    {
        static bool Check(int[]W, int m, int n ,int  k)
        {
            //一つのトラックに何個詰め込むか
            int othlug = 0;
            int car_num = 1;
            for(int i=0; i<n; i++)
            {
                if (othlug + W[i] <= m)
                {
                    //暫定のPの値mが荷物量をオーバーしてないならもう一個積む
                    othlug += W[i];
                    continue;
                }
                else
                {
                    //オーバーしたら次のトラック出動
                    car_num++;
                    othlug = W[i];
                }
            }
            return car_num<=k;
        }
        public static void Main()
        {
            //荷物数C[0]、トラックの数C[1]
            string[] C = Console.ReadLine().Split(' ');
            //荷物数
            int n = int.Parse(C[0]);
            //トラックの数
            int k = int.Parse(C[1]);
            //荷物の重さW
            int[] W = new int[n];
            for(int i=0; i<n; i++)
            {
                W[i] = int.Parse(Console.ReadLine());
            }
            //まずは暫定的なPの値を決め、だんだん下げていく探索
            int biglug = W.Max();
            int sum = W.Sum();
            
            while(biglug < sum)
            {
                //mは暫定のPの値
                int m = (biglug + sum) / 2;
                if (Check(W, m, n , k))//トラックの積載量の変更で台数がオーバーしないなら
                {
                    //上限を下げる
                    sum = m;
                }
                else
                {
                    //下限を上げる
                    biglug = m + 1;
                }
            }
            Console.WriteLine(sum);
        }

    }
}