from math import ceil

def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    ret = 0
    for i in range(n):
        ret += ceil(A[i]/arg)-1
    return bool(ret<=k)

def meguru_bisect(ng, ok):
    '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    '''
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok

n,k = map(int,input().split())
A = list(map(int,input().split()))

print(meguru_bisect(0,max(A)+1)) from math import ceil def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    ret = 0
    for i in range(n):
        ret += ceil(A[i]/arg)-1
    return bool(ret<=k) is_ok ret = 0 ret 0 for i in range(n):
        ret += ceil(A[i]/arg)-1
     i range(n) range n ret += ceil(A[i]/arg)-1 ret ceil(A[i]/arg)-1 ceil(A[i]/arg) ceil A[i]/arg A[i] A i arg 1 return bool(ret<=k) bool(ret<=k) bool ret<=k ret k arg arg def meguru_bisect(ng, ok):
    '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    '''
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok meguru_bisect '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    ''' while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
     abs(ok - ng) > 1 abs(ok - ng) abs ok - ng ok ng 1 mid = (ok + ng) // 2 mid (ok + ng) // 2 ok + ng ok ng 2 if is_ok(mid):
            ok = mid
        else:
            ng = mid
     is_ok(mid) is_ok mid ok = mid ok mid ng = mid ng mid return ok ok ng ng ok ok n,k = map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split k A = list(map(int,input().split())) A list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split print(meguru_bisect(0,max(A)+1)) print meguru_bisect(0,max(A)+1) meguru_bisect 0 max(A)+1 max(A) max A 1 A = list(map(int,input().split())) list(map(int,input().split())) A k = map(int,input().split()) map(int,input().split()) k def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    ret = 0
    for i in range(n):
        ret += ceil(A[i]/arg)-1
    return bool(ret<=k) def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    ret = 0
    for i in range(n):
        ret += ceil(A[i]/arg)-1
    return bool(ret<=k) is_ok n,k = map(int,input().split()) map(int,input().split()) n def meguru_bisect(ng, ok):
    '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    '''
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok def meguru_bisect(ng, ok):
    '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    '''
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok meguru_bisect
from math import ceil

def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    ret = 0
    for i in range(n):
        ret += ceil(A[i]/arg)-1
    return bool(ret<=k)

def meguru_bisect(ng, ok):
    '''
    初期値のng,okを受け取り,is_okを満たす最小(最大)のokを返す
    まずis_okを定義すべし
    ng ok は  とり得る最小の値-1 とり得る最大の値+1
    最大最小が逆の場合はよしなにひっくり返す
    '''
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok

n,k = map(int,input().split())
A = list(map(int,input().split()))

print(meguru_bisect(0,max(A)+1))