def nosereru?(p, k, a)
    sum = 0
    cnt = 1
    for i in 0..a.length-1
        return false if a[i] > p
        # printf("%d番目の積み荷　重量%d\n", i, a[i])
        sum += a[i]
        # printf("積み荷合計 %d\n", sum)
        if sum > p then
            # printf("積載量オーバー (積載量 = %d)\n", p)
            cnt += 1
            # printf("\nトラック%d台目開始\n", cnt)
            sum = a[i]
            # printf("積み荷合計 %d\n", sum)
        end
    end
    if cnt <= k then
        # printf("%d台以下で積載可能\n\n", k)
        return true
    else
        # printf("%d台以下では積載不可\n\n", k)
        return false
    end
end

n, k = gets.split.map(&:to_i)
a = []
n.times{
    a.push(gets.to_i)
}

left = 0
right = 100000*10000
# printf("検討対象 は %s 〜 %s\n", left, right)

until right == left
    mid = (left + right) / 2
    # printf("mid = %dで検討\n", mid)
    if nosereru?(mid, k, a) then
        right = mid
        # printf("検討対象 は %s 〜 %s\n", left, right)
    else
        left = mid + 1
        # printf("検討対象 は %s 〜 %s\n", left, right)
    end
end

puts right
