@pak_num_n, @trk_num_k = gets.split.map(&:to_i)
@pak_weight = readlines(chomp: true).map(&:to_i)

def check(max_sum_wgt_p) # 仮定した最大積載量で、トラックに積み込めるかチェック
  pak_w_idx = 0 # 加算する荷物の重さインデックス

  @trk_num_k.times do | truck | # トラックの数、次のトラックへ
    sum_wgt = 0
    # 仮定した最大積載量より、合計した荷物の重さが、小さい場合、繰り返す。大きい場合積み込めないので次のトラックへ
    while (sum_wgt += @pak_weight[pak_w_idx]) <= max_sum_wgt_p

      pak_w_idx += 1 # 加算する荷物の重さインデックスを一つ進める
      # 荷物の重さインデックスが、荷物の個数と同じになった場合
      if pak_w_idx == @pak_num_n
        return @pak_num_n # 荷物をすべて積み込めたとみなして荷物の個数を返す
      end
    end
  end
  pak_w_idx # 積み込めなかった場合、限界まで積み込めた個数を返す
end

def slove()
  left = 0 # 二分探索で使う左
  right = 100_000 * 10_000 # 荷物の数 * 荷物の重さ = 最大積載量を仮定
  # right = 30
  
  while (right - left) > 1 
    mid = (left +  right) / 2 # 中央値を決める
    stk_pak_num_v = check(mid) # 最大積載量を中央値で仮定し、チェックした後、個数を

    if stk_pak_num_v >= @pak_num_n # 仮定した最大積載量で積み込めた荷物の個数が、荷物の個数以上の場合
      right = mid # 仮定する最大積載量を小さくしていく
    else
      left = mid # 仮定した最大積載量で積み込めた無かった場合、仮定する最大積載量を大きくしていく
    end
  end
  right
end

puts slove()
