Problem p02598 (C++)

Buggy submission (status: Runtime Error):
// #include<bits/stdc++.h>
// using namespace std;
// #define mem(a) memset(a,0,sizeof(a))
// #define dbg(x) cout<<#x<<" = "<<x<<endl
// #define ll long long
////不要再爆long long了！！！！！！！！不要再爆long long了！！！！！！！
// multiset<double>s;
// void prt()
//{
//	for(multiset<double>::iterator it=s.begin();it!=s.end();it++)
//	{
//		prllf("%lf ",*it);
//	}
//	cout<<endl;
// }
// ll main()
//{
//	ll n,k;
//	cin>>n>>k;
//	for(ll i=0;i<n;i++)
//	{
//		double t;
//		scanf("%lf",&t);
//		s.insert(t);
//		prt();//************
//	}
//	for(ll i=0;i<k;i++)
//	{
//		multiset<double>::iterator it=--s.end();
//		double t=*it;
//		s.erase(it);
//		t/=2;
//		s.insert(t),s.insert(t);
//		prt();//************
//	}
//	double t=*(--s.end());
//	ll a=t;
//	if(t-a>=0.5)a++;
//	prllf("%d\n",a);
//	return 0;
// }

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define ll long long
// 不要再爆long long了！！！！！！！！不要再爆long long了！！！！！！！
ll len[200010];
ll M = 0, n, k;
ll erfen() {
  ll m = 0, mid;
  if (!k)
    return M;
  while (M > m) {
    mid = (M + m) >> 1;
    ll s = 0;
    for (ll i = 0; i < n; i++) {
      if (len[i] <= mid)
        continue;
      //			//ll t=1.*len[i]/(1.*mid+0.5)-1;
      //			if(t<=0)t=1;
      //			long double l=1.*len[i]/(t+1);
      //			if(l-0.5>=mid)t++;
      //			s+=t;

      ll t = len[i] / (mid);
      if (t * (mid) == len[i])
        t--;
      s += t;
    }
    // printf("m=%d M=%d mid=%d s=%d\n",m,M,mid,s);
    if (s > k)
      m = mid + 1;
    else
      M = mid;
  }
  return (M + m) / 2;
}
int main() {
  cin >> n >> k;
  for (ll i = 0; i < n; i++) {
    scanf("%lld", &len[i]);
    M = (len[i] > M ? len[i] : M);
  }
  printf("%lld\n", erfen());
  return 0;
}

Fixed submission:
// #include<bits/stdc++.h>
// using namespace std;
// #define mem(a) memset(a,0,sizeof(a))
// #define dbg(x) cout<<#x<<" = "<<x<<endl
// #define ll long long
////不要再爆long long了！！！！！！！！不要再爆long long了！！！！！！！
// multiset<double>s;
// void prt()
//{
//	for(multiset<double>::iterator it=s.begin();it!=s.end();it++)
//	{
//		prllf("%lf ",*it);
//	}
//	cout<<endl;
// }
// ll main()
//{
//	ll n,k;
//	cin>>n>>k;
//	for(ll i=0;i<n;i++)
//	{
//		double t;
//		scanf("%lf",&t);
//		s.insert(t);
//		prt();//************
//	}
//	for(ll i=0;i<k;i++)
//	{
//		multiset<double>::iterator it=--s.end();
//		double t=*it;
//		s.erase(it);
//		t/=2;
//		s.insert(t),s.insert(t);
//		prt();//************
//	}
//	double t=*(--s.end());
//	ll a=t;
//	if(t-a>=0.5)a++;
//	prllf("%d\n",a);
//	return 0;
// }

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define ll long long
// 不要再爆long long了！！！！！！！！不要再爆long long了！！！！！！！
ll len[200010];
ll M = 0, n, k;
ll erfen() {
  ll m = 0, mid;
  if (!k)
    return M;
  while (M > m) {
    mid = (M + m) >> 1;
    ll s = 0;
    for (ll i = 0; i < n; i++) {
      if (len[i] <= mid)
        continue;
      //			//ll t=1.*len[i]/(1.*mid+0.5)-1;
      //			if(t<=0)t=1;
      //			long double l=1.*len[i]/(t+1);
      //			if(l-0.5>=mid)t++;
      //			s+=t;
      if (mid == 0) {
        s = k + 1;
        continue;
      }
      ll t = len[i] / (mid);
      if (t * (mid) == len[i])
        t--;
      s += t;
    }
    // printf("m=%d M=%d mid=%d s=%d\n",m,M,mid,s);
    if (s > k)
      m = mid + 1;
    else
      M = mid;
  }
  return (M + m) / 2;
}
int main() {
  cin >> n >> k;
  for (ll i = 0; i < n; i++) {
    scanf("%lld", &len[i]);
    M = (len[i] > M ? len[i] : M);
  }
  printf("%lld\n", erfen());
  return 0;
}