n,k = map(int,input().split())
ls = list(map(int,input().split()))
#二分探索
#適切にokとngを定めていきましょう
def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    num = 0
    for i in range(n):
        num += -(-ls[i] // arg) -1
    if num <= k:
        return True
    return False
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
print(meguru_bisect(0, max(ls)+1)) n,k = map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split k ls = list(map(int,input().split())) ls list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    num = 0
    for i in range(n):
        num += -(-ls[i] // arg) -1
    if num <= k:
        return True
    return False is_ok num = 0 num 0 for i in range(n):
        num += -(-ls[i] // arg) -1
     i range(n) range n num += -(-ls[i] // arg) -1 num -(-ls[i] // arg) -1 -(-ls[i] // arg) -ls[i] // arg -ls[i] ls[i] ls i arg 1 if num <= k:
        return True
     num <= k num k return True True return False False 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 print(meguru_bisect(0, max(ls)+1)) print meguru_bisect(0, max(ls)+1) meguru_bisect 0 max(ls)+1 max(ls) max ls 1 ls = list(map(int,input().split())) list(map(int,input().split())) ls k = map(int,input().split()) map(int,input().split()) k n,k = map(int,input().split()) map(int,input().split()) n def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    num = 0
    for i in range(n):
        num += -(-ls[i] // arg) -1
    if num <= k:
        return True
    return False def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    num = 0
    for i in range(n):
        num += -(-ls[i] // arg) -1
    if num <= k:
        return True
    return False is_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 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
n,k = map(int,input().split())
ls = list(map(int,input().split()))
#二分探索
#適切にokとngを定めていきましょう
def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    num = 0
    for i in range(n):
        num += -(-ls[i] // arg) -1
    if num <= k:
        return True
    return False
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
print(meguru_bisect(0, max(ls)+1))
