import kotlin.math.abs
import kotlin.math.ceil

private fun getInts(): IntArray {
    return readLine()!!.split(" ").map {it.toInt()}.toIntArray()
}

fun main() {
    val nk = getInts()
    val n = nk[0]
    val k = nk[1]
    val an = getInts()

    if (k==0){
        print(an.max())
        return
    }

    // バイナリサーチする。
    var left = 0
    var right = 1000000000
    while(true) {
        if (right - left <= 1) {
            print(right)
            return
        }
        val mid = (left + right) / 2
        val middleCuttingNum = totCut(an,mid)
        if (k >= middleCuttingNum) {
            // 中央も許容できる。
            right = mid
        } else {
            // 許容できない。
            left = mid
        }
    }
}

// カット回数
fun cuttingNum(loglength:Int,limitLength : Int) :Int {
    return ceil(loglength.toDouble()/ limitLength.toDouble()).toInt() - 1
}

fun totCut(arr :IntArray,input: Int): Int {
    return arr.map {
        cuttingNum(it,input)
    }.sum()
}