from __future__ import print_function

import sys
sys.setrecursionlimit(500000)

import re
import array
import copy
import functools
import operator

import math
import string
import fractions
from fractions import Fraction

import collections
import itertools
import bisect

import random
import time

import heapq
from heapq import heappush
from heapq import heappop
from heapq import heappushpop
from heapq import heapify
from heapq import heapreplace
from queue import PriorityQueue as pq
from queue import Queue

from itertools import accumulate

from collections import deque
from collections import Counter

from operator import mul
from functools import reduce

input = sys.stdin.readline


def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)
    return

# from fractions import gcd
# from math import gcd

# def lcm(n, m):
#     return int(n * m / gcd(n, m))


# def coprimize(p, q):
#     common = gcd(p, q)
#     return (p // common, q // common)


# def find_gcd(list_l):
#     x = reduce(gcd, list_l)
#     return x


# def combinations_count(n, r):
#     r = min(r, n - r)
#     numer = reduce(mul, range(n, n - r, -1), 1)
#     denom = reduce(mul, range(1, r + 1), 1)
#     return numer // denom


# mod=1000000007
# def combinations_count_mod(n, r):
#     r = min(r, n - r)
#     numer = reduce(lambda x,y: x*y%mod, range(n, n - r, -1), 1)
#     denom = pow( reduce(lambda x,y: x*y%mod, range(1, r + 1), 1) , mod-2, mod)
#     return numer * denom % mod

def is_ok(p,n,k,w):
    #
    i_track = 0
    i_w = 0

    # トラックに積めるギリギリ(p)まで積んでいくことを繰り返していって，
    # i_w(w_index) を0 ~ n-1 まで全部積めたら嬉しいねぇ
    # 積載量pが小さすぎるゴミみてぇなトラックだったら先にトラックの数が尽きてしまって悲しいことになります
    # 積載量pが十分大きい素敵なトラックだったら i_w(w_index) = n - 1 まで到達できてとっても嬉しくなれます
    while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

    return i_w == n

def solve(n,k,w):
    # 
    ok = 10000 * 100000  # solve(ok)は解が存在すると分かっているような整数ok
    ng = -1                # solve(ng)は解が存在しない(と分かっているような整数ng
    ans = ok

    # abs(ok-ng) つまり ok と ng の絶対差ですね，これが1未満つまりokとngが等しいということになったらですね，終了するんですね
    while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
    return ans

def main():
    n,k  = map(int,input().strip().split())
    w=[]
    for i in range(n):
        w.append(int(input().strip()))
    print(solve(n,k,w))

if __name__ == '__main__':
    main() from __future__ import print_function import sys sys sys.setrecursionlimit(500000) sys.setrecursionlimit sys setrecursionlimit 500000 import re re import array array import copy copy import functools functools import operator operator import math math import string string import fractions fractions from fractions import Fraction import collections collections import itertools itertools import bisect bisect import random random import time time import heapq heapq from heapq import heappush from heapq import heappop from heapq import heappushpop from heapq import heapify from heapq import heapreplace from queue import PriorityQueue as pq from queue import Queue from itertools import accumulate from collections import deque from collections import Counter from operator import mul from functools import reduce input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)
    return

# from fractions import gcd
# from math import gcd

# def lcm(n, m):
#     return int(n * m / gcd(n, m))


# def coprimize(p, q):
#     common = gcd(p, q)
#     return (p // common, q // common)


# def find_gcd(list_l):
#     x = reduce(gcd, list_l)
#     return x


# def combinations_count(n, r):
#     r = min(r, n - r)
#     numer = reduce(mul, range(n, n - r, -1), 1)
#     denom = reduce(mul, range(1, r + 1), 1)
#     return numer // denom


# mod=1000000007
# def combinations_count_mod(n, r):
#     r = min(r, n - r)
#     numer = reduce(lambda x,y: x*y%mod, range(n, n - r, -1), 1)
#     denom = pow( reduce(lambda x,y: x*y%mod, range(1, r + 1), 1) , mod-2, mod)
#     return numer * denom % mod eprint print(*args, file=sys.stderr, **kwargs) print *args args file=sys.stderr file sys.stderr sys stderr **kwargs kwargs return *args **kwargs def is_ok(p,n,k,w):
    #
    i_track = 0
    i_w = 0

    # トラックに積めるギリギリ(p)まで積んでいくことを繰り返していって，
    # i_w(w_index) を0 ~ n-1 まで全部積めたら嬉しいねぇ
    # 積載量pが小さすぎるゴミみてぇなトラックだったら先にトラックの数が尽きてしまって悲しいことになります
    # 積載量pが十分大きい素敵なトラックだったら i_w(w_index) = n - 1 まで到達できてとっても嬉しくなれます
    while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

    return i_w == n is_ok i_track = 0 i_track 0 i_w = 0 i_w 0 while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

     i_track < k and i_w < n i_track < k i_track k i_w < n i_w n temp=0 temp 0 while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
         i_w < n and temp + w[i_w] <= p i_w < n i_w n temp + w[i_w] <= p temp + w[i_w] temp w[i_w] w i_w p temp += w[i_w] temp w[i_w] w i_w i_w+=1 i_w 1 i_track += 1 i_track 1 return i_w == n i_w == n i_w n p p n n k k w w def solve(n,k,w):
    # 
    ok = 10000 * 100000  # solve(ok)は解が存在すると分かっているような整数ok
    ng = -1                # solve(ng)は解が存在しない(と分かっているような整数ng
    ans = ok

    # abs(ok-ng) つまり ok と ng の絶対差ですね，これが1未満つまりokとngが等しいということになったらですね，終了するんですね
    while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
    return ans solve ok = 10000 * 100000 ok 10000 * 100000 10000 100000 ng = -1 ng -1 ans = ok ans ok while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
     abs( ok - ng ) > 1 abs( ok - ng ) abs ok - ng ok ng 1 mid = (ok + ng) // 2 mid (ok + ng) // 2 ok + ng ok ng 2 if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
     is_ok(mid,n,k,w) is_ok mid n k w ok = mid ok mid ans = ok ans ok ng = mid ng mid return ans ans n n k k w w def main():
    n,k  = map(int,input().strip().split())
    w=[]
    for i in range(n):
        w.append(int(input().strip()))
    print(solve(n,k,w)) main n,k  = map(int,input().strip().split()) n map(int,input().strip().split()) map int input().strip().split() ().strip().split ().strip() ().strip () input strip split k w=[] w [] for i in range(n):
        w.append(int(input().strip()))
     i range(n) range n w.append(int(input().strip())) w.append w append int(input().strip()) int input().strip() ().strip () input strip print(solve(n,k,w)) print solve(n,k,w) solve n k w if __name__ == '__main__':
    main() __name__ == '__main__' __name__ '__main__' main() main def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)
    return

# from fractions import gcd
# from math import gcd

# def lcm(n, m):
#     return int(n * m / gcd(n, m))


# def coprimize(p, q):
#     common = gcd(p, q)
#     return (p // common, q // common)


# def find_gcd(list_l):
#     x = reduce(gcd, list_l)
#     return x


# def combinations_count(n, r):
#     r = min(r, n - r)
#     numer = reduce(mul, range(n, n - r, -1), 1)
#     denom = reduce(mul, range(1, r + 1), 1)
#     return numer // denom


# mod=1000000007
# def combinations_count_mod(n, r):
#     r = min(r, n - r)
#     numer = reduce(lambda x,y: x*y%mod, range(n, n - r, -1), 1)
#     denom = pow( reduce(lambda x,y: x*y%mod, range(1, r + 1), 1) , mod-2, mod)
#     return numer * denom % mod def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)
    return

# from fractions import gcd
# from math import gcd

# def lcm(n, m):
#     return int(n * m / gcd(n, m))


# def coprimize(p, q):
#     common = gcd(p, q)
#     return (p // common, q // common)


# def find_gcd(list_l):
#     x = reduce(gcd, list_l)
#     return x


# def combinations_count(n, r):
#     r = min(r, n - r)
#     numer = reduce(mul, range(n, n - r, -1), 1)
#     denom = reduce(mul, range(1, r + 1), 1)
#     return numer // denom


# mod=1000000007
# def combinations_count_mod(n, r):
#     r = min(r, n - r)
#     numer = reduce(lambda x,y: x*y%mod, range(n, n - r, -1), 1)
#     denom = pow( reduce(lambda x,y: x*y%mod, range(1, r + 1), 1) , mod-2, mod)
#     return numer * denom % mod eprint def main():
    n,k  = map(int,input().strip().split())
    w=[]
    for i in range(n):
        w.append(int(input().strip()))
    print(solve(n,k,w)) def main():
    n,k  = map(int,input().strip().split())
    w=[]
    for i in range(n):
        w.append(int(input().strip()))
    print(solve(n,k,w)) main def solve(n,k,w):
    # 
    ok = 10000 * 100000  # solve(ok)は解が存在すると分かっているような整数ok
    ng = -1                # solve(ng)は解が存在しない(と分かっているような整数ng
    ans = ok

    # abs(ok-ng) つまり ok と ng の絶対差ですね，これが1未満つまりokとngが等しいということになったらですね，終了するんですね
    while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
    return ans def solve(n,k,w):
    # 
    ok = 10000 * 100000  # solve(ok)は解が存在すると分かっているような整数ok
    ng = -1                # solve(ng)は解が存在しない(と分かっているような整数ng
    ans = ok

    # abs(ok-ng) つまり ok と ng の絶対差ですね，これが1未満つまりokとngが等しいということになったらですね，終了するんですね
    while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
    return ans solve input = sys.stdin.readline sys.stdin.readline input def is_ok(p,n,k,w):
    #
    i_track = 0
    i_w = 0

    # トラックに積めるギリギリ(p)まで積んでいくことを繰り返していって，
    # i_w(w_index) を0 ~ n-1 まで全部積めたら嬉しいねぇ
    # 積載量pが小さすぎるゴミみてぇなトラックだったら先にトラックの数が尽きてしまって悲しいことになります
    # 積載量pが十分大きい素敵なトラックだったら i_w(w_index) = n - 1 まで到達できてとっても嬉しくなれます
    while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

    return i_w == n def is_ok(p,n,k,w):
    #
    i_track = 0
    i_w = 0

    # トラックに積めるギリギリ(p)まで積んでいくことを繰り返していって，
    # i_w(w_index) を0 ~ n-1 まで全部積めたら嬉しいねぇ
    # 積載量pが小さすぎるゴミみてぇなトラックだったら先にトラックの数が尽きてしまって悲しいことになります
    # 積載量pが十分大きい素敵なトラックだったら i_w(w_index) = n - 1 まで到達できてとっても嬉しくなれます
    while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

    return i_w == n is_ok
from __future__ import print_function

import sys
sys.setrecursionlimit(500000)

import re
import array
import copy
import functools
import operator

import math
import string
import fractions
from fractions import Fraction

import collections
import itertools
import bisect

import random
import time

import heapq
from heapq import heappush
from heapq import heappop
from heapq import heappushpop
from heapq import heapify
from heapq import heapreplace
from queue import PriorityQueue as pq
from queue import Queue

from itertools import accumulate

from collections import deque
from collections import Counter

from operator import mul
from functools import reduce

input = sys.stdin.readline


def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)
    return

# from fractions import gcd
# from math import gcd

# def lcm(n, m):
#     return int(n * m / gcd(n, m))


# def coprimize(p, q):
#     common = gcd(p, q)
#     return (p // common, q // common)


# def find_gcd(list_l):
#     x = reduce(gcd, list_l)
#     return x


# def combinations_count(n, r):
#     r = min(r, n - r)
#     numer = reduce(mul, range(n, n - r, -1), 1)
#     denom = reduce(mul, range(1, r + 1), 1)
#     return numer // denom


# mod=1000000007
# def combinations_count_mod(n, r):
#     r = min(r, n - r)
#     numer = reduce(lambda x,y: x*y%mod, range(n, n - r, -1), 1)
#     denom = pow( reduce(lambda x,y: x*y%mod, range(1, r + 1), 1) , mod-2, mod)
#     return numer * denom % mod

def is_ok(p,n,k,w):
    #
    i_track = 0
    i_w = 0

    # トラックに積めるギリギリ(p)まで積んでいくことを繰り返していって，
    # i_w(w_index) を0 ~ n-1 まで全部積めたら嬉しいねぇ
    # 積載量pが小さすぎるゴミみてぇなトラックだったら先にトラックの数が尽きてしまって悲しいことになります
    # 積載量pが十分大きい素敵なトラックだったら i_w(w_index) = n - 1 まで到達できてとっても嬉しくなれます
    while i_track < k and i_w < n : # トラック全部
        temp=0
        while i_w < n and temp + w[i_w] <= p: #  一時積載tempがpを超えないギリギリを目指していけ
            temp += w[i_w]
            i_w+=1
        # ギリギリまで ，背番号i_trackのトラック ，つまり今見ているトラックに積載したら
        i_track += 1 #次のトラックに進みましょうね〜〜〜

    return i_w == n

def solve(n,k,w):
    # 
    ok = 10000 * 100000  # solve(ok)は解が存在すると分かっているような整数ok
    ng = -1                # solve(ng)は解が存在しない(と分かっているような整数ng
    ans = ok

    # abs(ok-ng) つまり ok と ng の絶対差ですね，これが1未満つまりokとngが等しいということになったらですね，終了するんですね
    while abs( ok - ng ) > 1: #abs(ok-ng) <= 1 というのはokとngがもうなんかね，アレなんですよ
        mid = (ok + ng) // 2
        # 
        if is_ok(mid,n,k,w):
            ok = mid
            ans = ok
        else:
            ng = mid
    return ans

def main():
    n,k  = map(int,input().strip().split())
    w=[]
    for i in range(n):
        w.append(int(input().strip()))
    print(solve(n,k,w))

if __name__ == '__main__':
    main()
