def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    c = 0
    for x in a:
        c += -(-x//arg) - 1
    return c <= k

def meguru_bisect(ng, ok):
    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,10**9+1)) def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    c = 0
    for x in a:
        c += -(-x//arg) - 1
    return c <= k is_ok c = 0 c 0 for x in a:
        c += -(-x//arg) - 1
     x a c += -(-x//arg) - 1 c -(-x//arg) - 1 -(-x//arg) -x//arg -x x arg 1 return c <= k c <= k c k arg arg def meguru_bisect(ng, ok):
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok meguru_bisect 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,10**9+1)) print meguru_bisect(0,10**9+1) meguru_bisect 0 10**9+1 10**9 10 9 1 def meguru_bisect(ng, ok):
    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):
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok meguru_bisect 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):
    # 条件を満たすかどうか？問題ごとに定義
    c = 0
    for x in a:
        c += -(-x//arg) - 1
    return c <= k def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    c = 0
    for x in a:
        c += -(-x//arg) - 1
    return c <= k is_ok n,k = map(int,input().split()) map(int,input().split()) n
def is_ok(arg):
    # 条件を満たすかどうか？問題ごとに定義
    c = 0
    for x in a:
        c += -(-x//arg) - 1
    return c <= k

def meguru_bisect(ng, ok):
    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,10**9+1))