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

l = min(A)//(k+1) 
r = max(A)
m = (l+r)//2+1

while 1:
    
    m = (l+r)//2
    if m==0:
        m=1
        break

    
    #m以下の長さにできるか判定
    
    # A_long = A[A>m]
    n= sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] )
    
    # print(l,m,r,n)
    
    if n<=k:
        if r==m:
            break
        r=m-1
    else:
        if l==m:
            m+=1
            break
        l=m+1
        

        
print(m) 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 = min(A)//(k+1) l min(A)//(k+1) min(A) min A k+1 k 1 r = max(A) r max(A) max A m = (l+r)//2+1 m (l+r)//2+1 (l+r)//2 l+r l r 2 1 while 1:
    
    m = (l+r)//2
    if m==0:
        m=1
        break

    
    #m以下の長さにできるか判定
    
    # A_long = A[A>m]
    n= sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] )
    
    # print(l,m,r,n)
    
    if n<=k:
        if r==m:
            break
        r=m-1
    else:
        if l==m:
            m+=1
            break
        l=m+1
        

         1 m = (l+r)//2 m (l+r)//2 l+r l r 2 if m==0:
        m=1
        break

    
    #m以下の長さにできるか判定
    
    # A_long = A[A>m]
     m==0 m 0 m=1 m 1 break int((A[i]-0.1)//(m)) for i in range(len(A)) for i in range(len(A)) i range(len(A)) range len(A) len A for i in range(len(A)) int((A[i]-0.1)//(m)) int (A[i]-0.1)//(m) A[i]-0.1 A[i] A i 0.1 m n= sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] ) n sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] ) sum [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] if n<=k:
        if r==m:
            break
        r=m-1
    else:
        if l==m:
            m+=1
            break
        l=m+1
        

         n<=k n k if r==m:
            break
         r==m r m break r=m-1 r m-1 m 1 if l==m:
            m+=1
            break
         l==m l m m+=1 m 1 break l=m+1 l m+1 m 1 print(m) print m k =  map(int,input().split()) map(int,input().split()) k m=1 1 m A = list(map(int,input().split())) list(map(int,input().split())) A m = (l+r)//2 (l+r)//2 m l=m+1 m+1 l n,k =  map(int,input().split()) map(int,input().split()) n l = min(A)//(k+1) min(A)//(k+1) l m+=1 1 m r = max(A) max(A) r m = (l+r)//2+1 (l+r)//2+1 m n= sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] ) sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] ) n r=m-1 m-1 r
n,k =  map(int,input().split())
A = list(map(int,input().split()))

l = min(A)//(k+1) 
r = max(A)
m = (l+r)//2+1

while 1:
    
    m = (l+r)//2
    if m==0:
        m=1
        break

    
    #m以下の長さにできるか判定
    
    # A_long = A[A>m]
    n= sum( [  int((A[i]-0.1)//(m)) for i in range(len(A)) ] )
    
    # print(l,m,r,n)
    
    if n<=k:
        if r==m:
            break
        r=m-1
    else:
        if l==m:
            m+=1
            break
        l=m+1
        

        
print(m)