Problem p02658 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>

using i32 = int_fast32_t;
using i64 = int_fast64_t;
using u32 = uint_fast32_t;
using u64 = uint_fast64_t;
using f64 = double;
using f80 = long double;

#define FOR(v, a, b) for (i64 v = (a); v < (b); ++v)
#define FORE(v, a, b) for (i64 v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for (i64 v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define ITR(it, c) for (auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for (auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c, x) ((c).find(x) != (c).end())
#define fst first
#define snd second
#define UNIQ(v) (v).erase(unique(ALL(v)), (v).end())
#define bit(i) (1LL << (i))

#ifdef DEBUG
#include <Mylib/Debug/debug.cpp>
#else
#define dump(...) ((void)0)
#endif

using namespace std;

template <typename I> void join(ostream &ost, I s, I t, string d = " ") {
  for (auto i = s; i != t; ++i) {
    if (i != s)
      ost << d;
    ost << *i;
  }
  ost << endl;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &a : v)
    is >> a;
  return is;
}

template <typename T, typename U> bool chmin(T &a, const U &b) {
  return (a > b ? a = b, true : false);
}
template <typename T, typename U> bool chmax(T &a, const U &b) {
  return (a < b ? a = b, true : false);
}

template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  fill((U *)a, (U *)(a + N), v);
}
template <typename T> auto make_vector(int n, int m, const T &value) {
  return vector<vector<T>>(n, vector<T>(m, value));
}

template <typename T> void print(const T &value) { std::cout << value << "\\n"; }
template <typename T, typename... Args>
void print(const T &value, const Args &...args) {
  std::cout << value << " ";
  print(args...);
}

struct Init {
  Init() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
    cerr << fixed << setprecision(12);
  }
} init;

const i64 MAX = 1000000000000000000;

int main() {
  int N;

  while (cin >> N) {
    vector<i64> A(N);
    cin >> A;
    bool ok = true;

    i64 ans = 1;

    REP(i, N) {
      i64 k;
      if (__builtin_smulll_overflow(ans, A[i], (long long int *)&k)) {
        ok = false;
        break;
      }

      if (ans * A[i] > MAX) {
        ok = false;
        break;
      }

      ans = k;
    }

    REP(i, N) if (A[i] == 0) ok = true, ans = 0;

    if (!ok) {
      print(-1);
    } else {
      print(ans);
    }
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using i32 = int_fast32_t;
using i64 = int_fast64_t;
using u32 = uint_fast32_t;
using u64 = uint_fast64_t;
using f64 = double;
using f80 = long double;

#define FOR(v, a, b) for (i64 v = (a); v < (b); ++v)
#define FORE(v, a, b) for (i64 v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for (i64 v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define ITR(it, c) for (auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for (auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c, x) ((c).find(x) != (c).end())
#define fst first
#define snd second
#define UNIQ(v) (v).erase(unique(ALL(v)), (v).end())
#define bit(i) (1LL << (i))

#ifdef DEBUG
#include <Mylib/Debug/debug.cpp>
#else
#define dump(...) ((void)0)
#endif

using namespace std;

template <typename I> void join(ostream &ost, I s, I t, string d = " ") {
  for (auto i = s; i != t; ++i) {
    if (i != s)
      ost << d;
    ost << *i;
  }
  ost << endl;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &a : v)
    is >> a;
  return is;
}

template <typename T, typename U> bool chmin(T &a, const U &b) {
  return (a > b ? a = b, true : false);
}
template <typename T, typename U> bool chmax(T &a, const U &b) {
  return (a < b ? a = b, true : false);
}

template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  fill((U *)a, (U *)(a + N), v);
}
template <typename T> auto make_vector(int n, int m, const T &value) {
  return vector<vector<T>>(n, vector<T>(m, value));
}

template <typename T> void print(const T &value) { std::cout << value << "\\n"; }
template <typename T, typename... Args>
void print(const T &value, const Args &...args) {
  std::cout << value << " ";
  print(args...);
}

struct Init {
  Init() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
    cerr << fixed << setprecision(12);
  }
} init;

#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision;

const i64 MAX = 1000000000000000000;

int main() {
  int N;

  while (cin >> N) {
    vector<i64> A(N);
    cin >> A;

    mp::cpp_int ans = 1;
    REP(i, N) { ans *= A[i]; }

    if (ans > MAX) {
      print(-1);
    } else {
      print(ans);
    }
  }

  return 0;
}