import math

M=list(map(int, input().split()))
N=M[0]
K=M[1]

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

def cancut(A,N,K,X): #A1..ANをK回で全てX以下に切れるか？Yesなら1、Noなら2を返す。
    cut=0
    for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
    if cut<=K:
        return 1
    else:
        return 0

left=0
right=max(A)

while(abs(right - left) > 1):
    mid=(right+left)//2
    if cancut(A,N,K,mid)==1:
        right=mid
    else:
        left=mid

print(right) import math math M=list(map(int, input().split())) M list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split N=M[0] N M[0] M 0 K=M[1] K M[1] M 1 A=list(map(int, input().split())) A list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split def cancut(A,N,K,X): #A1..ANをK回で全てX以下に切れるか？Yesなら1、Noなら2を返す。
    cut=0
    for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
    if cut<=K:
        return 1
    else:
        return 0 cancut cut=0 cut 0 for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
     a A n = (a + X - 1) // X n (a + X - 1) // X a + X - 1 a + X a X 1 X cut += n - 1 cut n - 1 n 1 if cut<=K:
        return 1
    else:
        return 0 cut<=K cut K return 1 1 return 0 0 A A N N K K X X left=0 left 0 right=max(A) right max(A) max A while(abs(right - left) > 1):
    mid=(right+left)//2
    if cancut(A,N,K,mid)==1:
        right=mid
    else:
        left=mid abs(right - left) > 1 abs(right - left) abs right - left right left 1 mid=(right+left)//2 mid (right+left)//2 right+left right left 2 if cancut(A,N,K,mid)==1:
        right=mid
    else:
        left=mid cancut(A,N,K,mid)==1 cancut(A,N,K,mid) cancut A N K mid 1 right=mid right mid left=mid left mid print(right) print right M=list(map(int, input().split())) list(map(int, input().split())) M K=M[1] M[1] K right=max(A) max(A) right mid=(right+left)//2 (right+left)//2 mid def cancut(A,N,K,X): #A1..ANをK回で全てX以下に切れるか？Yesなら1、Noなら2を返す。
    cut=0
    for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
    if cut<=K:
        return 1
    else:
        return 0 def cancut(A,N,K,X): #A1..ANをK回で全てX以下に切れるか？Yesなら1、Noなら2を返す。
    cut=0
    for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
    if cut<=K:
        return 1
    else:
        return 0 cancut N=M[0] M[0] N A=list(map(int, input().split())) list(map(int, input().split())) A left=0 0 left right=mid mid right left=mid mid left
import math

M=list(map(int, input().split()))
N=M[0]
K=M[1]

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

def cancut(A,N,K,X): #A1..ANをK回で全てX以下に切れるか？Yesなら1、Noなら2を返す。
    cut=0
    for a in A:
        n = (a + X - 1) // X  # a/x の少数切上げ
        cut += n - 1
    if cut<=K:
        return 1
    else:
        return 0

left=0
right=max(A)

while(abs(right - left) > 1):
    mid=(right+left)//2
    if cancut(A,N,K,mid)==1:
        right=mid
    else:
        left=mid

print(right)