import math
n, k = map(int, input().split())
w = [int(input()) for i in range(n)]


def check(P): # 最駄積載量Pのk台のトラックで何個目の荷物まで積めるか。積める荷物の数をreturn
    i = 0
    for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
    return i

# 今、条件より1<=w<=10,000であり、1<=n<=100000
# つまり、トラックの最大積載量の取りうる最大値はこれらが一つのトラックに乗る時、つまり100000*10000
# 従ってこの範囲でPを探索すればよい
# 二分探索を使うことができる（これらのmidをPと仮定してcheckで積める個数を調べる
#→これがnよりも大きければPはもっと小さくて良いと言うことなのでrightをmidに、小さければleftをmidに！

        
def solve():
    left = 0
    right = 100000*10000
    while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
    return right

ans = math.floor(solve())
print(ans)

 import math math n, k = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split k int(input()) for i in range(n) for i in range(n) i range(n) range n for i in range(n) int(input()) int input() input w = [int(input()) for i in range(n)] w [int(input()) for i in range(n)] def check(P): # 最駄積載量Pのk台のトラックで何個目の荷物まで積めるか。積める荷物の数をreturn
    i = 0
    for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
    return i

# 今、条件より1<=w<=10,000であり、1<=n<=100000
# つまり、トラックの最大積載量の取りうる最大値はこれらが一つのトラックに乗る時、つまり100000*10000
# 従ってこの範囲でPを探索すればよい
# 二分探索を使うことができる（これらのmidをPと仮定してcheckで積める個数を調べる
#→これがnよりも大きければPはもっと小さくて良いと言うことなのでrightをmidに、小さければleftをmidに！

         check i = 0 i 0 for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
     j range(k) range k s = 0 s 0 while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
     (s + w[i]) <= P s + w[i] s w[i] w i P s += w[i] s w[i] w i i += 1 i 1 if (i==n):
                return n
     i==n i n return n n return i i P P def solve():
    left = 0
    right = 100000*10000
    while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
    return right solve left = 0 left 0 right = 100000*10000 right 100000*10000 100000 10000 while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
     (right - left) > 1 right - left right left 1 mid = (left + right) / 2 mid (left + right) / 2 left + right left right 2 v = check(mid) v check(mid) check mid if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
     v >= n v n right = mid right mid left = mid left mid return right right ans = math.floor(solve()) ans math.floor(solve()) math.floor math floor solve() solve print(ans) print ans k = map(int, input().split()) map(int, input().split()) k def check(P): # 最駄積載量Pのk台のトラックで何個目の荷物まで積めるか。積める荷物の数をreturn
    i = 0
    for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
    return i

# 今、条件より1<=w<=10,000であり、1<=n<=100000
# つまり、トラックの最大積載量の取りうる最大値はこれらが一つのトラックに乗る時、つまり100000*10000
# 従ってこの範囲でPを探索すればよい
# 二分探索を使うことができる（これらのmidをPと仮定してcheckで積める個数を調べる
#→これがnよりも大きければPはもっと小さくて良いと言うことなのでrightをmidに、小さければleftをmidに！

         def check(P): # 最駄積載量Pのk台のトラックで何個目の荷物まで積めるか。積める荷物の数をreturn
    i = 0
    for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
    return i

# 今、条件より1<=w<=10,000であり、1<=n<=100000
# つまり、トラックの最大積載量の取りうる最大値はこれらが一つのトラックに乗る時、つまり100000*10000
# 従ってこの範囲でPを探索すればよい
# 二分探索を使うことができる（これらのmidをPと仮定してcheckで積める個数を調べる
#→これがnよりも大きければPはもっと小さくて良いと言うことなのでrightをmidに、小さければleftをmidに！

         check ans = math.floor(solve()) math.floor(solve()) ans def solve():
    left = 0
    right = 100000*10000
    while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
    return right def solve():
    left = 0
    right = 100000*10000
    while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
    return right solve n, k = map(int, input().split()) map(int, input().split()) n w = [int(input()) for i in range(n)] [int(input()) for i in range(n)] w
import math
n, k = map(int, input().split())
w = [int(input()) for i in range(n)]


def check(P): # 最駄積載量Pのk台のトラックで何個目の荷物まで積めるか。積める荷物の数をreturn
    i = 0
    for j in range(k):
        s = 0
        while (s + w[i]) <= P:
            s += w[i]
            i += 1
            if (i==n):
                return n
    return i

# 今、条件より1<=w<=10,000であり、1<=n<=100000
# つまり、トラックの最大積載量の取りうる最大値はこれらが一つのトラックに乗る時、つまり100000*10000
# 従ってこの範囲でPを探索すればよい
# 二分探索を使うことができる（これらのmidをPと仮定してcheckで積める個数を調べる
#→これがnよりも大きければPはもっと小さくて良いと言うことなのでrightをmidに、小さければleftをmidに！

        
def solve():
    left = 0
    right = 100000*10000
    while (right - left) > 1:
        mid = (left + right) / 2
        v = check(mid)
        if (v >= n):   # ?
            right = mid
        else:
            left = mid
            
    return right

ans = math.floor(solve())
print(ans)


