# 入力
# 値は全てint
# Nは本数、Kは切る回数、AはN本の木のそれぞれの長さ(リスト)
N,K = map(int,input().split())
A = list(map(int,input().split()))

# 二分探索
# lが左端、rが右端
l,r = 0, 10**9

# 整数で返すので、差が１より大きい時はループする
while r - l > 1:
    # 真ん中を設定
    x = (r+l) // 2

    # 切る回数をc
    c = 0
    for a in A:
        # それぞれの丸太の(長さ-1)をxで割った値の合計が、切る回数
        c += (a-1) // x 

    # 切る回数がKよりも小さい時はOKなので右端を寄せる
    if c <= K:
        r = x
    else:
        l = x
    
print(r) 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 l,r = 0, 10**9 l 0 r 10**9 10 9 while r - l > 1:
    # 真ん中を設定
    x = (r+l) // 2

    # 切る回数をc
    c = 0
    for a in A:
        # それぞれの丸太の(長さ-1)をxで割った値の合計が、切る回数
        c += (a-1) // x 

    # 切る回数がKよりも小さい時はOKなので右端を寄せる
    if c <= K:
        r = x
    else:
        l = x
     r - l > 1 r - l r l 1 x = (r+l) // 2 x (r+l) // 2 r+l r l 2 c = 0 c 0 for a in A:
        # それぞれの丸太の(長さ-1)をxで割った値の合計が、切る回数
        c += (a-1) // x 

    # 切る回数がKよりも小さい時はOKなので右端を寄せる
     a A c += (a-1) // x c (a-1) // x a-1 a 1 x if c <= K:
        r = x
    else:
        l = x
     c <= K c K r = x r x l = x l x print(r) print r c += (a-1) // x (a-1) // x c K = map(int,input().split()) map(int,input().split()) K A = list(map(int,input().split())) list(map(int,input().split())) A r = 0, 10**9 10**9 r c = 0 0 c x = (r+l) // 2 (r+l) // 2 x l = x x l r = x x r l,r = 0, 10**9 0 l N,K = map(int,input().split()) map(int,input().split()) N
# 入力
# 値は全てint
# Nは本数、Kは切る回数、AはN本の木のそれぞれの長さ(リスト)
N,K = map(int,input().split())
A = list(map(int,input().split()))

# 二分探索
# lが左端、rが右端
l,r = 0, 10**9

# 整数で返すので、差が１より大きい時はループする
while r - l > 1:
    # 真ん中を設定
    x = (r+l) // 2

    # 切る回数をc
    c = 0
    for a in A:
        # それぞれの丸太の(長さ-1)をxで割った値の合計が、切る回数
        c += (a-1) // x 

    # 切る回数がKよりも小さい時はOKなので右端を寄せる
    if c <= K:
        r = x
    else:
        l = x
    
print(r)
