n,k=map(int,input().split())
w=[0 for _ in range(100001)]
for i in range(n):
    w[i]=int(input())

#最大積載量pとした時のチェック
def check(p):
    sumw=0
    idx=0

    for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
    return False

left=0
right=100000*10000

while(right - left > 1):
    mid = (left + right)//2
#    print("最大積載量p:{0}".format(mid))
    if(check(mid)):
        right=mid
    else:
        left=mid
#    print("main:left:{0} right:{1} mid:{2}".format(left,right,mid))

print(right)
 n,k=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split k 0 for _ in range(100001) for _ in range(100001) _ range(100001) range 100001 for _ in range(100001) 0 w=[0 for _ in range(100001)] w [0 for _ in range(100001)] for i in range(n):
    w[i]=int(input())

#最大積載量pとした時のチェック i range(n) range n w[i]=int(input()) w[i] w i int(input()) int input() input def check(p):
    sumw=0
    idx=0

    for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
    return False check sumw=0 sumw 0 idx=0 idx 0 for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
     i range(k) range k sumw=0 sumw 0 while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
     w[idx]+sumw<=p w[idx]+sumw w[idx] w idx sumw p sumw+=w[idx] sumw w[idx] w idx idx+=1 idx 1 if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
     idx==n idx n return True True return False False p p left=0 left 0 right=100000*10000 right 100000*10000 100000 10000 while(right - left > 1):
    mid = (left + right)//2
#    print("最大積載量p:{0}".format(mid))
    if(check(mid)):
        right=mid
    else:
        left=mid
#    print("main:left:{0} right:{1} mid:{2}".format(left,right,mid)) right - left > 1 right - left right left 1 mid = (left + right)//2 mid (left + right)//2 left + right left right 2 if(check(mid)):
        right=mid
    else:
        left=mid
#    print("main:left:{0} right:{1} mid:{2}".format(left,right,mid)) check(mid) check mid right=mid right mid left=mid left mid print(right) print right def check(p):
    sumw=0
    idx=0

    for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
    return False def check(p):
    sumw=0
    idx=0

    for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
    return False check w=[0 for _ in range(100001)] [0 for _ in range(100001)] w k=map(int,input().split()) map(int,input().split()) k mid = (left + right)//2 (left + right)//2 mid left=0 0 left right=100000*10000 100000*10000 right left=mid mid left n,k=map(int,input().split()) map(int,input().split()) n right=mid mid right
n,k=map(int,input().split())
w=[0 for _ in range(100001)]
for i in range(n):
    w[i]=int(input())

#最大積載量pとした時のチェック
def check(p):
    sumw=0
    idx=0

    for i in range(k):
        sumw=0
        while(w[idx]+sumw<=p):
            sumw+=w[idx]
            idx+=1
            if(idx==n):
#                print("{0}台で運べる:w[{1}]まで、 積載量{2} 最大積載量{3} ".format(i+1,idx,sumw,p))
                return True
#            print("runT:{0} {1} {2} k={3}".format(idx,sumw,p,i))
#        print("{0}台目:w[{1}]まで、 積載量{2} 最大積載量{3}".format(i+1,idx-1,sumw,p))
#    print("運べない:w[{0}]でアウト 積載量{1} 最大積載量{2} k={3}".format(idx,sumw,p,k-1))
    return False

left=0
right=100000*10000

while(right - left > 1):
    mid = (left + right)//2
#    print("最大積載量p:{0}".format(mid))
    if(check(mid)):
        right=mid
    else:
        left=mid
#    print("main:left:{0} right:{1} mid:{2}".format(left,right,mid))

print(right)

