n, k = gets.split.map(&:to_i)
ws = n.times.map{ gets.to_i }

def check(ws, p, k, n)
  # 最大積載量pのk台のトラックにwsを詰めるか.
  # @return 詰めた荷物の数
  #
  i = 0 # 荷物のindex
  k.times do # k台のトラックに順に積んでいく
    s = 0
    while i != n && s + ws[i] <= p
      s += ws[i]
      i += 1
    end
  end
  return i
end

# PのMax: トラック数の最大値*1つの重さの最大値
left, right = 0, 100000 * 10000
#while left < right
while (right - left) > 1 # <- TODO: なんで??
  mid = (left + right) / 2
  num_w = check(ws, mid, k, n)
  if num_w >= n # nを超えた値が返ってくることはない
    right = mid
  else
    left = mid
  end
end
p right
