import sys

n, truck_num = map(int, input().split())
weights = [int(x) for x in map(int, sys.stdin)]


def main():
    # 最小値と最大値をもとに二分探索する
    print(binary_search(max(weights), sum(weights)))


def binary_search(left, right):
    """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """

    while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

    return left


def simulate(mid, wei, t_num):
    """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """
    count = 1
    tmp = 0
    for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
    return True


if __name__ == '__main__':
    main()

 import sys sys n, truck_num = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split truck_num int(x) for x in map(int, sys.stdin) for x in map(int, sys.stdin) x map(int, sys.stdin) map int sys.stdin sys stdin for x in map(int, sys.stdin) int(x) int x weights = [int(x) for x in map(int, sys.stdin)] weights [int(x) for x in map(int, sys.stdin)] def main():
    # 最小値と最大値をもとに二分探索する
    print(binary_search(max(weights), sum(weights))) main print(binary_search(max(weights), sum(weights))) print binary_search(max(weights), sum(weights)) binary_search max(weights) max weights sum(weights) sum weights def binary_search(left, right):
    """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """

    while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

    return left binary_search """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """ while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

     left < right left right middle = (left + right) // 2 middle (left + right) // 2 left + right left right 2 if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

     simulate(middle, weights, truck_num) simulate middle weights truck_num right = middle right middle left = middle + 1 left middle + 1 middle 1 return left left left left right right def simulate(mid, wei, t_num):
    """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """
    count = 1
    tmp = 0
    for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
    return True simulate """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """ count = 1 count 1 tmp = 0 tmp 0 for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
     w wei tmp += w tmp w if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
     mid < tmp mid tmp tmp = w tmp w count += 1 count 1 if t_num < count:
                return False
     t_num < count t_num count return False False return True True mid mid wei wei t_num t_num if __name__ == '__main__':
    main() __name__ == '__main__' __name__ '__main__' main() main def simulate(mid, wei, t_num):
    """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """
    count = 1
    tmp = 0
    for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
    return True def simulate(mid, wei, t_num):
    """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """
    count = 1
    tmp = 0
    for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
    return True simulate def main():
    # 最小値と最大値をもとに二分探索する
    print(binary_search(max(weights), sum(weights))) def main():
    # 最小値と最大値をもとに二分探索する
    print(binary_search(max(weights), sum(weights))) main truck_num = map(int, input().split()) map(int, input().split()) truck_num n, truck_num = map(int, input().split()) map(int, input().split()) n weights = [int(x) for x in map(int, sys.stdin)] [int(x) for x in map(int, sys.stdin)] weights def binary_search(left, right):
    """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """

    while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

    return left def binary_search(left, right):
    """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """

    while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

    return left binary_search
import sys

n, truck_num = map(int, input().split())
weights = [int(x) for x in map(int, sys.stdin)]


def main():
    # 最小値と最大値をもとに二分探索する
    print(binary_search(max(weights), sum(weights)))


def binary_search(left, right):
    """二分探索

    :param left: 最小値
    :param right: 最大値
    :return:
    """

    while left < right:
        # 真ん中の値を割り当てる
        middle = (left + right) // 2

        # 真ん中の値で一旦シミュレート
        if simulate(middle, weights, truck_num):
            # OKならば、最大値をシミュレートした値に
            right = middle
        else:
            # NGならば、最小値をシミュレートした+1に
            left = middle + 1

    return left


def simulate(mid, wei, t_num):
    """

    :param mid: 中央値
    :param wei: 荷物が格納されたリスト
    :param t_num: トラックの台数
    :return: シミュレートOKかNGか
    """
    count = 1
    tmp = 0
    for w in wei:
        tmp += w

        # 積載量(tmp)が求める答え(mid)より大きくなったら
        if mid < tmp:
            # tmpを次の積載物に初期化
            tmp = w
            count += 1
            if t_num < count:
                return False
    return True


if __name__ == '__main__':
    main()


