Problem p02598 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define CPP_STR(x) CPP_STR_I(x)
#define CPP_CAT(x, y) CPP_CAT_I(x, y)
#define CPP_STR_I(args...) #args
#define CPP_CAT_I(x, y) x##y

using i8 = int8_t;
using u8 = uint8_t;
using i16 = int16_t;
using u16 = uint16_t;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;

using f32 = float;
using f64 = double;

#define FOR(i, start, end)                                                     \
  for (i64 i = (start), CPP_CAT(i, xxxx_end) = (end);                          \
       i < CPP_CAT(i, xxxx_end); ++i)
#define REP(i, n) FOR(i, 0, n)
#define REPS(i, n) for (i64 i = 1; i <= n; ++i)
#define RREP(i, n) for (i64 i = n - 1; i >= 0; --i)
#define RREPS(i, n) for (i64 i = n; i >= 1; --i)

#define ALL(f, c, ...)                                                         \
  (([&](decltype((c)) cccc) {                                                  \
    return (f)(std::begin(cccc), std::end(cccc), ##__VA_ARGS__);               \
  })(c))

#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end());

#define pb push_back
#define mp make_pair

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename C> i64 SIZE(const C &c) {
  return static_cast<i64>(c.size());
}

template <typename T, size_t N> i64 SIZE(const T (&)[N]) {
  return static_cast<i64>(N);
}

#define YES(n) cout << ((n) ? "YES" : "NO") << endl
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl
#define POSSIBLE(n) cout << ((n) ? "POSSIBLE" : "IMPOSSIBLE") << endl
#define Possible(n) cout << ((n) ? "Possible" : "Impossible") << endl

#define VIN(x)                                                                 \
  for (auto &youso_ : (x))                                                     \
  cin >> youso_
#define VOUT(x, delim)                                                         \
  for (auto &youso_ : (x))                                                     \
    cout << youso_ << delim;                                                   \
  cout << endl

#define COUT(x) cout << (x) << endl
void CINT() {}
template <class Head, class... Tail> void CINT(Head &&head, Tail &&...tail) {
  cin >> head;
  CINT(move(tail)...);
}
#define CIN(...)                                                               \
  i64 __VA_ARGS__;                                                             \
  CINT(__VA_ARGS__)
#define SCIN(...)                                                              \
  string __VA_ARGS__;                                                          \
  CINT(__VA_ARGS__)

struct ProconInit {
  static constexpr int IOS_PREC = 15;
  static constexpr bool AUTOFLUSH = false;

  ProconInit() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(IOS_PREC);
    if (AUTOFLUSH)
      cout << unitbuf;
  }
} PROCON_INIT;

int main() {
  CIN(N, K);
  vector<i64> A(N);
  VIN(A);
  ALL(sort, A, greater<i64>());

  auto ok = [&](i64 x) {
    i64 cnt = 0;
    REP(i, N) {
      if (A[i] <= x)
        break;
      cnt += A[i] / x;
    }
    return cnt <= K;
  };

  i64 ub = A[0] + 1;
  i64 lb = 0;
  REP(i, 100) {
    i64 mid = (ub + lb) / 2;

    if (ok(mid))
      ub = mid;
    else
      lb = mid;
  }
  COUT(ub);

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define CPP_STR(x) CPP_STR_I(x)
#define CPP_CAT(x, y) CPP_CAT_I(x, y)
#define CPP_STR_I(args...) #args
#define CPP_CAT_I(x, y) x##y

using i8 = int8_t;
using u8 = uint8_t;
using i16 = int16_t;
using u16 = uint16_t;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;

using f32 = float;
using f64 = double;

#define FOR(i, start, end)                                                     \
  for (i64 i = (start), CPP_CAT(i, xxxx_end) = (end);                          \
       i < CPP_CAT(i, xxxx_end); ++i)
#define REP(i, n) FOR(i, 0, n)
#define REPS(i, n) for (i64 i = 1; i <= n; ++i)
#define RREP(i, n) for (i64 i = n - 1; i >= 0; --i)
#define RREPS(i, n) for (i64 i = n; i >= 1; --i)

#define ALL(f, c, ...)                                                         \
  (([&](decltype((c)) cccc) {                                                  \
    return (f)(std::begin(cccc), std::end(cccc), ##__VA_ARGS__);               \
  })(c))

#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end());

#define pb push_back
#define mp make_pair

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename C> i64 SIZE(const C &c) {
  return static_cast<i64>(c.size());
}

template <typename T, size_t N> i64 SIZE(const T (&)[N]) {
  return static_cast<i64>(N);
}

#define YES(n) cout << ((n) ? "YES" : "NO") << endl
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl
#define POSSIBLE(n) cout << ((n) ? "POSSIBLE" : "IMPOSSIBLE") << endl
#define Possible(n) cout << ((n) ? "Possible" : "Impossible") << endl

#define VIN(x)                                                                 \
  for (auto &youso_ : (x))                                                     \
  cin >> youso_
#define VOUT(x, delim)                                                         \
  for (auto &youso_ : (x))                                                     \
    cout << youso_ << delim;                                                   \
  cout << endl

#define COUT(x) cout << (x) << endl
void CINT() {}
template <class Head, class... Tail> void CINT(Head &&head, Tail &&...tail) {
  cin >> head;
  CINT(move(tail)...);
}
#define CIN(...)                                                               \
  i64 __VA_ARGS__;                                                             \
  CINT(__VA_ARGS__)
#define SCIN(...)                                                              \
  string __VA_ARGS__;                                                          \
  CINT(__VA_ARGS__)

struct ProconInit {
  static constexpr int IOS_PREC = 15;
  static constexpr bool AUTOFLUSH = false;

  ProconInit() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(IOS_PREC);
    if (AUTOFLUSH)
      cout << unitbuf;
  }
} PROCON_INIT;

int main() {
  CIN(N, K);
  vector<i64> A(N);
  VIN(A);
  ALL(sort, A, greater<i64>());

  auto ok = [&](i64 x) {
    i64 cnt = 0;
    REP(i, N) {
      if (A[i] <= x)
        break;
      cnt += A[i] / x;
    }
    return cnt <= K;
  };

  i64 ub = A[0] + 1;
  i64 lb = 0;
  while (ub - lb > 1) {
    i64 mid = (ub + lb) / 2;

    if (ok(mid))
      ub = mid;
    else
      lb = mid;
  }
  COUT(ub);

  return 0;
}