Problem:
Score : 500 points

Problem Statement

We have N logs of lengths A_1,A_2,\cdots A_N.

We can cut these logs at most K times in total. When a log of length L is cut at a point whose distance from an end of the log is t (0<t<L), it becomes two logs of lengths t and L-t.

Find the shortest possible length of the longest log after at most K cuts, and print it after rounding up to an integer.

Constraints

1 \leq N \leq 2 \times 10^5

0 \leq K \leq 10^9

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \cdots A_N

Output

Print an integer representing the answer.

Sample Input 1

2 3
7 9

Sample Output 1

4

First, we will cut the log of length 7 at a point whose distance from an end of the log is 3.5, resulting in two logs of length 3.5 each.

Next, we will cut the log of length 9 at a point whose distance from an end of the log is 3, resulting in two logs of length 3 and 6.

Lastly, we will cut the log of length 6 at a point whose distance from an end of the log is 3.3, resulting in two logs of length 3.3 and 2.7.

In this case, the longest length of a log will be 3.5, which is the shortest possible result. After rounding up to an integer, the output should be 4.

Sample Input 2

3 0
3 4 5

Sample Output 2

5

Sample Input 3

10 10
158260522 877914575 602436426 24979445 861648772 623690081 433933447 476190629 262703497 211047202

Sample Output 3

292638192

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
typedef long long ll;
#define fr(i,a,b) for(ll i=a; i<b; i++)
#define rf(i,a,b) for(ll i=a; i>=b; i--)
typedef std::vector<long long > vi ;
#define F first
#define S second
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define mod 1000000007
#define PB push_back
#define MP make_pair
#define PI 3.14159265358979323846
#define all(a) a.begin(),a.end()
#define mx(a) *max_element(all(a))
#define mn(a) *min_element(all(a))
#define endl '\n'
#define show(a) for(auto el:a)cout<<el<<" "
const ll INF=LLONG_MAX/2;
const ll N=2e5+1;
#define yesno(f) yes(f);no(f);
#define yes(f) if(f)cout<<"YES\n";
#define no(f) if(!f)cout<<"NO\n";
using  namespace std;
ll a[200005],k,n,sum=0;
ll check(ll x)
{
    ll ans=0,kk=k;
    if(x==0)
    {
    if(sum>kk)
    return 0;
    else
    return 1;
    
    }
    rf(i,n-1,0)
    {
        if(a[i]<x)
        break;
        if(kk<0)
        {
            ans=1;
            break;
        }
        if(a[i]%x==0)
        kk=kk-a[i]/x+1;
        else 
        {
            kk=kk-a[i]/x;
        }

    }
    if(ans==1||kk<0)
    return 0;
    else
    return 1;
}
int main()
{
    fast;
   ll t;
    t=1;
   while(t--)
   {
       ll i,j=0,d;
       std::cin >> n>>k;
       fr(i,0,n)
       {
           std::cin >> a[i];
           sum=sum+2*a[i];
       }
       sort(a,a+n);
       ll r=*max_element(a,a+n),l=1,ans1=1000000007;
       while(l<=r)
       {
           ll mid=(l+r)/2;
           if(check(mid))
           {
               ans1=min(ans1,mid);
               r=mid-1;
           }
           else
           l=mid+1;
       }
       cout<<ans1<<"\n";
   }
}