#最大値の最小値を求める問題は二分探索
#求めるものを変数と見て丸太の最大値がxだとすると
#丸太の長さは全てx以下である必要があるため切るべき回数がわかる
#それがk回以下ならokだしそれがk回を超えていたらだめ
n,k=list(map(int,input().split()))
a=list(map(int,input().split()))
ng=0
ok=max(a)

def check(x):
  num=0
  for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
  return num<=k

while ok-ng>1:
  mid=(ok+ng)//2
  if check(mid):
    ok=mid
  else:
    ng=mid
print(ok)
 n,k=list(map(int,input().split())) n list(map(int,input().split())) list 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 ng=0 ng 0 ok=max(a) ok max(a) max a def check(x):
  num=0
  for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
  return num<=k check num=0 num 0 for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
   i range(n) range n if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
   a[i]%x==0 a[i]%x a[i] a i x 0 num=num+a[i]//x-1 num num+a[i]//x-1 num+a[i]//x num a[i]//x a[i] a i x 1 num=num+a[i]//x num num+a[i]//x num a[i]//x a[i] a i x return num<=k num<=k num k x x while ok-ng>1:
  mid=(ok+ng)//2
  if check(mid):
    ok=mid
  else:
    ng=mid ok-ng>1 ok-ng ok ng 1 mid=(ok+ng)//2 mid (ok+ng)//2 ok+ng ok ng 2 if check(mid):
    ok=mid
  else:
    ng=mid check(mid) check mid ok=mid ok mid ng=mid ng mid print(ok) print ok ok=mid mid ok a=list(map(int,input().split())) list(map(int,input().split())) a def check(x):
  num=0
  for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
  return num<=k def check(x):
  num=0
  for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
  return num<=k check ng=0 0 ng ng=mid mid ng mid=(ok+ng)//2 (ok+ng)//2 mid k=list(map(int,input().split())) list(map(int,input().split())) k n,k=list(map(int,input().split())) list(map(int,input().split())) n ok=max(a) max(a) ok
#最大値の最小値を求める問題は二分探索
#求めるものを変数と見て丸太の最大値がxだとすると
#丸太の長さは全てx以下である必要があるため切るべき回数がわかる
#それがk回以下ならokだしそれがk回を超えていたらだめ
n,k=list(map(int,input().split()))
a=list(map(int,input().split()))
ng=0
ok=max(a)

def check(x):
  num=0
  for i in range(n):
    if a[i]%x==0:
      num=num+a[i]//x-1
    else:
      num=num+a[i]//x
  return num<=k

while ok-ng>1:
  mid=(ok+ng)//2
  if check(mid):
    ok=mid
  else:
    ng=mid
print(ok)

