import math

N, K = map(int,input().split())
A = list(map(int,input().split()))

L = 1
R = 10**9+1
ans = float("INF")

while True: # midの長さの丸太に切るとして2分探索
    mid = (L + R) // 2
    cur = 0
    for i in range(N):
        cur += math.ceil(A[i]/mid) - 1 # 切る必要回数
    
    if cur > K: #K回より大きい時は、L=midとして長くする 
        if L == mid:
            break
        L = mid
    else: #K回以下の時は、R=midとして短くする 
        ans = min(ans, mid)
        if R == mid:
            break
        R = mid
        
print(ans) import math math 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 = 1 L 1 R = 10**9+1 R 10**9+1 10**9 10 9 1 ans = float("INF") ans float("INF") float "INF" while True: # midの長さの丸太に切るとして2分探索
    mid = (L + R) // 2
    cur = 0
    for i in range(N):
        cur += math.ceil(A[i]/mid) - 1 # 切る必要回数
    
    if cur > K: #K回より大きい時は、L=midとして長くする 
        if L == mid:
            break
        L = mid
    else: #K回以下の時は、R=midとして短くする 
        ans = min(ans, mid)
        if R == mid:
            break
        R = mid
         True mid = (L + R) // 2 mid (L + R) // 2 L + R L R 2 cur = 0 cur 0 for i in range(N):
        cur += math.ceil(A[i]/mid) - 1 # 切る必要回数
    
     i range(N) range N cur += math.ceil(A[i]/mid) - 1 cur math.ceil(A[i]/mid) - 1 math.ceil(A[i]/mid) math.ceil math ceil A[i]/mid A[i] A i mid 1 if cur > K: #K回より大きい時は、L=midとして長くする 
        if L == mid:
            break
        L = mid
    else: #K回以下の時は、R=midとして短くする 
        ans = min(ans, mid)
        if R == mid:
            break
        R = mid
         cur > K cur K if L == mid:
            break
         L == mid L mid break L = mid L mid ans = min(ans, mid) ans min(ans, mid) min ans mid if R == mid:
            break
         R == mid R mid break R = mid R mid print(ans) print ans L = mid mid L K = map(int,input().split()) map(int,input().split()) K R = mid mid R L = 1 1 L R = 10**9+1 10**9+1 R ans = min(ans, mid) min(ans, mid) ans A = list(map(int,input().split())) list(map(int,input().split())) A ans = float("INF") float("INF") ans cur = 0 0 cur cur += math.ceil(A[i]/mid) - 1 math.ceil(A[i]/mid) - 1 cur N, K = map(int,input().split()) map(int,input().split()) N mid = (L + R) // 2 (L + R) // 2 mid
import math

N, K = map(int,input().split())
A = list(map(int,input().split()))

L = 1
R = 10**9+1
ans = float("INF")

while True: # midの長さの丸太に切るとして2分探索
    mid = (L + R) // 2
    cur = 0
    for i in range(N):
        cur += math.ceil(A[i]/mid) - 1 # 切る必要回数
    
    if cur > K: #K回より大きい時は、L=midとして長くする 
        if L == mid:
            break
        L = mid
    else: #K回以下の時は、R=midとして短くする 
        ans = min(ans, mid)
        if R == mid:
            break
        R = mid
        
print(ans)