Problem p02598 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define SPEED                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define FOR(i, a, b) for (ll i = a; i < b; ++i)
#define RFOR(i, b, a) for (ll i = b; i >= a; --i)
#define ALL(x) x.begin(), x.end()
#define DEBUG(args...)                                                         \
  {                                                                            \
    string _s = #args;                                                         \
    replace(ALL(_s), ' ', '\0');                                               \
    replace(ALL(_s), ',', ' ');                                                \
    stringstream _ss(_s);                                                      \
    istream_iterator<string> _it(_ss);                                         \
    _debug(_it, args);                                                         \
  }
#define endl "\n"
#define F first
#define S second
#define pb(x) push_back(x) a
#define mp(x, y) make_pair(x, y)

using namespace std;
using namespace __gnu_pbds;

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

void _debug(istream_iterator<string>) {}
template <typename T, typename... Args>
void _debug(istream_iterator<string> it, T first, Args... args) {
  cerr << ">> " << *it << " : " << first << endl;
  _debug(++it, args...);
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  return out << "(" << p.F << ", " << p.S << ")";
}
template <typename T>
inline ostream &operator<<(ostream &out, const vector<T> &v) {
  if (v.empty())
    return out << "[]";
  else {
    out << '[';
    for (auto &e : v) {
      out << e << ", ";
    }
    return out << "\b\b]";
  }
}
template <typename T>
inline ostream &operator<<(ostream &out, const set<T> &s) {
  if (s.empty())
    return out << "{}";
  else {
    out << '{';
    for (auto &e : s) {
      out << e << ", ";
    }
    return out << "\b\b}";
  }
}
template <typename T>
inline ostream &operator<<(ostream &out, const unordered_set<T> &s) {
  return out << set<T>(ALL(s));
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const map<T1, T2> &m) {
  if (m.empty())
    return out << "{}";
  out << '{';
  for (auto &p : m) {
    out << p << ", ";
  }
  return out << "\b\b}";
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const unordered_map<T1, T2> &m) {
  return out << map<T1, T2>(ALL(m));
}
template <typename T>
inline ostream &operator<<(ostream &out, const ordered_set<T> &s) {
  return out << set<T>(ALL(s));
}

typedef long long ll;
typedef long double ld;
typedef vector<long long> vll;
typedef pair<ll, ll> pll;
typedef vector<pair<ll, ll>> vpll;
typedef unordered_map<ll, ll> STll;
/************************************** MAIN PROGRAM
 * ********************************************/

int main() {
  // freopen("input.txt", "r", stdin);
  SPEED
  int n;
  cin >> n;
  int k;
  cin >> k;
  vector<int> a(n);
  for (auto &e : a)
    cin >> e;

  auto can = [&](int x) {
    int req = 0;
    for (auto e : a) {
      int parts = (e + x - 1) / x;
      req += parts - 1;
    }
    return req <= k;
  };

  int lo = 0, hi = 1e9, mid;
  while (lo < hi) {
    mid = lo + (hi - lo) / 2;
    if (can(mid)) {
      hi = mid;
    } else {
      lo = mid + 1;
    }
  }
  cout << lo;
}
/************************************** END OF PROGRAM
 * ******************************************/
/** Stuff you should look for:
 * int overflow, array bounds, over-counting
 * special cases (n=1?), set/unordered_set TLE, multi-set/set error
 * do something instead of nothing and stay organized
 */


Fixed submission:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define SPEED                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define FOR(i, a, b) for (ll i = a; i < b; ++i)
#define RFOR(i, b, a) for (ll i = b; i >= a; --i)
#define ALL(x) x.begin(), x.end()
#define DEBUG(args...)                                                         \
  {                                                                            \
    string _s = #args;                                                         \
    replace(ALL(_s), ' ', '\0');                                               \
    replace(ALL(_s), ',', ' ');                                                \
    stringstream _ss(_s);                                                      \
    istream_iterator<string> _it(_ss);                                         \
    _debug(_it, args);                                                         \
  }
#define endl "\n"
#define F first
#define S second
#define pb(x) push_back(x) a
#define mp(x, y) make_pair(x, y)

using namespace std;
using namespace __gnu_pbds;

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

void _debug(istream_iterator<string>) {}
template <typename T, typename... Args>
void _debug(istream_iterator<string> it, T first, Args... args) {
  cerr << ">> " << *it << " : " << first << endl;
  _debug(++it, args...);
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  return out << "(" << p.F << ", " << p.S << ")";
}
template <typename T>
inline ostream &operator<<(ostream &out, const vector<T> &v) {
  if (v.empty())
    return out << "[]";
  else {
    out << '[';
    for (auto &e : v) {
      out << e << ", ";
    }
    return out << "\b\b]";
  }
}
template <typename T>
inline ostream &operator<<(ostream &out, const set<T> &s) {
  if (s.empty())
    return out << "{}";
  else {
    out << '{';
    for (auto &e : s) {
      out << e << ", ";
    }
    return out << "\b\b}";
  }
}
template <typename T>
inline ostream &operator<<(ostream &out, const unordered_set<T> &s) {
  return out << set<T>(ALL(s));
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const map<T1, T2> &m) {
  if (m.empty())
    return out << "{}";
  out << '{';
  for (auto &p : m) {
    out << p << ", ";
  }
  return out << "\b\b}";
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &out, const unordered_map<T1, T2> &m) {
  return out << map<T1, T2>(ALL(m));
}
template <typename T>
inline ostream &operator<<(ostream &out, const ordered_set<T> &s) {
  return out << set<T>(ALL(s));
}

typedef long long ll;
typedef long double ld;
typedef vector<long long> vll;
typedef pair<ll, ll> pll;
typedef vector<pair<ll, ll>> vpll;
typedef unordered_map<ll, ll> STll;
/************************************** MAIN PROGRAM
 * ********************************************/

int main() {
  // freopen("input.txt", "r", stdin);
  SPEED
  int n;
  cin >> n;
  int k;
  cin >> k;
  vector<int> a(n);
  for (auto &e : a)
    cin >> e;

  auto can = [&](int x) {
    int req = 0;
    for (auto e : a) {
      int parts = (e + x - 1) / x;
      req += parts - 1;
    }
    return req <= k;
  };

  int lo = 1, hi = 1e9, mid;
  while (lo < hi) {
    mid = lo + (hi - lo) / 2;
    if (can(mid)) {
      hi = mid;
    } else {
      lo = mid + 1;
    }
  }
  cout << lo;
}
/************************************** END OF PROGRAM
 * ******************************************/
/** Stuff you should look for:
 * int overflow, array bounds, over-counting
 * special cases (n=1?), set/unordered_set TLE, multi-set/set error
 * do something instead of nothing and stay organized
 */