Problem p03973 (C++)

Buggy submission (status: Time Limit Exceeded):
#ifndef __clang__
#pragma GCC optimize("-O3")
#endif
#ifdef ONLINE_JUDGE
#define NDEBUG 1
#endif
#define _GLIBCXX_USE_CXX11_ABI 0
#include <bits/stdc++.h>
#include <stdio.h>

#define DESTRUCT2(p, a, b)                                                     \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);

#define DESTRUCT3(p, a, b, c)                                                  \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);                                                          \
  auto c = get<2>(p);

#define DESTRUCT4(p, a, b, c, d)                                               \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);                                                          \
  auto c = get<2>(p);                                                          \
  auto d = get<3>(p);

#define FOR(i, n) for (lli i = 0; i < (lli)(n); ++i)
#define FORU(i, j, k) for (lli i = (j); i <= (lli)(k); ++i)
#define FORD(i, j, k) for (lli i = (j); i >= (lli)(k); --i)

#define SQ(x) ((x) * (x))

#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define eb emplace_back

using namespace std;

template <typename... As> struct tpl : public std::tuple<As...> {
  using std::tuple<As...>::tuple;

  template <typename T = tuple<As...>>
  typename tuple_element<0, T>::type const &x() const {
    return get<0>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<0, T>::type &x() {
    return get<0>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<1, T>::type const &y() const {
    return get<1>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<1, T>::type &y() {
    return get<1>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<2, T>::type const &z() const {
    return get<2>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<2, T>::type &z() {
    return get<2>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<3, T>::type const &w() const {
    return get<3>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<3, T>::type &w() {
    return get<3>(*this);
  }
};

using lli = long long int;
using llu = long long unsigned;

using pii = tpl<lli, lli>;
using piii = tpl<lli, lli, lli>;
using piiii = tpl<lli, lli, lli, lli>;
using vi = vector<lli>;
using vii = vector<pii>;
using viii = vector<piii>;
using vvi = vector<vi>;
using vvii = vector<vii>;
using vviii = vector<viii>;

template <class T> using min_queue = priority_queue<T, vector<T>, greater<T>>;
template <class T> using max_queue = priority_queue<T>;

template <size_t... I> struct my_index_sequence {
  using type = my_index_sequence;
  static constexpr array<size_t, sizeof...(I)> value = {{I...}};
};

namespace my_index_sequence_detail {
template <typename I, typename J> struct concat;
template <size_t... I, size_t... J>
struct concat<my_index_sequence<I...>, my_index_sequence<J...>>
    : my_index_sequence<I..., (sizeof...(I) + J)...> {};
template <size_t N>
struct make_index_sequence
    : concat<typename make_index_sequence<N / 2>::type,
             typename make_index_sequence<N - N / 2>::type>::type {};
template <> struct make_index_sequence<0> : my_index_sequence<> {};
template <> struct make_index_sequence<1> : my_index_sequence<0> {};
} // namespace my_index_sequence_detail

template <class... A>
using my_index_sequence_for =
    typename my_index_sequence_detail::make_index_sequence<sizeof...(A)>::type;

template <class T, size_t... I>
void print_tuple(ostream &s, T const &a, my_index_sequence<I...>) {
  using swallow = int[];
  (void)swallow{0, (void(s << (I == 0 ? "" : ", ") << get<I>(a)), 0)...};
}

template <class T> ostream &print_collection(ostream &s, T const &a) {
  s << '[';
  for (auto it = begin(a); it != end(a); ++it) {
    s << *it;
    if (it != prev(end(a)))
      s << " ";
  }
  return s << ']';
}

template <class... A> ostream &operator<<(ostream &s, tpl<A...> const &a) {
  s << '(';
  print_tuple(s, a, my_index_sequence_for<A...>{});
  return s << ')';
}

template <class... A> ostream &operator<<(ostream &s, tuple<A...> const &a) {
  s << '(';
  print_tuple(s, a, my_index_sequence_for<A...>{});
  return s << ')';
}

template <class A, class B>
ostream &operator<<(ostream &s, pair<A, B> const &a) {
  return s << "(" << get<0>(a) << ", " << get<1>(a) << ")";
}

template <class T, size_t I>
ostream &operator<<(ostream &s, array<T, I> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, vector<T> const &a) {
  return print_collection(s, a);
}
template <class T, class U>
ostream &operator<<(ostream &s, multimap<T, U> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, multiset<T> const &a) {
  return print_collection(s, a);
}
template <class T, class U>
ostream &operator<<(ostream &s, map<T, U> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, set<T> const &a) {
  return print_collection(s, a);
}

namespace std {
namespace {
template <class T> inline void hash_combine(size_t &seed, T const &v) {
  seed ^= hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
template <class Tuple, size_t Index = tuple_size<Tuple>::value - 1>
struct HashValueImpl {
  static void apply(size_t &seed, Tuple const &tuple) {
    HashValueImpl<Tuple, Index - 1>::apply(seed, tuple);
    hash_combine(seed, get<Index>(tuple));
  }
};
template <class Tuple> struct HashValueImpl<Tuple, 0> {
  static void apply(size_t &seed, Tuple const &tuple) {
    hash_combine(seed, get<0>(tuple));
  }
};
} // namespace
template <typename... TT> struct hash<tuple<TT...>> {
  size_t operator()(tuple<TT...> const &tt) const {
    size_t seed = 0;
    HashValueImpl<tuple<TT...>>::apply(seed, tt);
    return seed;
  }
};
template <typename... TT> struct hash<tpl<TT...>> {
  size_t operator()(tpl<TT...> const &tt) const {
    size_t seed = 0;
    HashValueImpl<tuple<TT...>>::apply(seed, tt);
    return seed;
  }
};
} // namespace std

int read_positive() {
  char c;
  int x = 0;
  do {
    c = getchar();
  } while (c < '0' || c > '9');
  while (c >= '0' && c <= '9') {
    x = 10 * x + (c - '0');
    c = getchar();
  }
  return x;
}

//------------------------------------------------------------------------------

// --- BEGIN SNIPPET PRIMES ---

const int MAXPRIME = 1000000;
vi primes;
bool sieve[MAXPRIME + 1];
int divv[MAXPRIME + 1];

void calcPrimes() {
  FORU(i, 2, MAXPRIME) sieve[i] = 1;
  FORU(i, 2, MAXPRIME) if (sieve[i]) {
    primes.pb(i);
    divv[i] = i;
    int k = 2;
    while (i * k <= MAXPRIME) {
      if (sieve[i * k])
        divv[i * k] = i;
      sieve[i * k] = 0;
      k += 1;
    }
  }
}

vi divvisors(lli x) {
  assert(primes.size());
  vi r;
  while (x > 1) {
    r.pb(divv[x]);
    x /= divv[x];
  }
  return r;
}

// --- END SNIPPET PRIMES ---

int main(int, char **) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  vi A(n);
  FOR(i, n) cin >> A[i];
  lli ans = 0;
  lli cur = 0;
  lli t = 1;
  while (1) {
    while (cur < n && A[cur] < t)
      cur += 1;
    if (cur == n) {
      break;
    }
    if (A[cur] == t) {
      t += 1;
      cur += 1;
    } else {
      // int d = (A[cur]-1)/t;
      ans += (A[cur] - 1) / t;
      if (cur == 0) {
        t += 1;
        cur += 1;
      }
      // if(d) A[cur] -= d*((A[cur]-1)/d);
      // t=max<lli>(t,A[cur]+1)
    }
  }
  lli ans0 = ans;
  cout << ans0 << endl;
  return 0;
}


Fixed submission:
#ifndef __clang__
#pragma GCC optimize("-O3")
#endif
#ifdef ONLINE_JUDGE
#define NDEBUG 1
#endif
#define _GLIBCXX_USE_CXX11_ABI 0
#include <bits/stdc++.h>
#include <stdio.h>

#define DESTRUCT2(p, a, b)                                                     \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);

#define DESTRUCT3(p, a, b, c)                                                  \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);                                                          \
  auto c = get<2>(p);

#define DESTRUCT4(p, a, b, c, d)                                               \
  auto a = get<0>(p);                                                          \
  auto b = get<1>(p);                                                          \
  auto c = get<2>(p);                                                          \
  auto d = get<3>(p);

#define FOR(i, n) for (lli i = 0; i < (lli)(n); ++i)
#define FORU(i, j, k) for (lli i = (j); i <= (lli)(k); ++i)
#define FORD(i, j, k) for (lli i = (j); i >= (lli)(k); --i)

#define SQ(x) ((x) * (x))

#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define eb emplace_back

using namespace std;

template <typename... As> struct tpl : public std::tuple<As...> {
  using std::tuple<As...>::tuple;

  template <typename T = tuple<As...>>
  typename tuple_element<0, T>::type const &x() const {
    return get<0>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<0, T>::type &x() {
    return get<0>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<1, T>::type const &y() const {
    return get<1>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<1, T>::type &y() {
    return get<1>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<2, T>::type const &z() const {
    return get<2>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<2, T>::type &z() {
    return get<2>(*this);
  }

  template <typename T = tuple<As...>>
  typename tuple_element<3, T>::type const &w() const {
    return get<3>(*this);
  }
  template <typename T = tuple<As...>> typename tuple_element<3, T>::type &w() {
    return get<3>(*this);
  }
};

using lli = long long int;
using llu = long long unsigned;

using pii = tpl<lli, lli>;
using piii = tpl<lli, lli, lli>;
using piiii = tpl<lli, lli, lli, lli>;
using vi = vector<lli>;
using vii = vector<pii>;
using viii = vector<piii>;
using vvi = vector<vi>;
using vvii = vector<vii>;
using vviii = vector<viii>;

template <class T> using min_queue = priority_queue<T, vector<T>, greater<T>>;
template <class T> using max_queue = priority_queue<T>;

template <size_t... I> struct my_index_sequence {
  using type = my_index_sequence;
  static constexpr array<size_t, sizeof...(I)> value = {{I...}};
};

namespace my_index_sequence_detail {
template <typename I, typename J> struct concat;
template <size_t... I, size_t... J>
struct concat<my_index_sequence<I...>, my_index_sequence<J...>>
    : my_index_sequence<I..., (sizeof...(I) + J)...> {};
template <size_t N>
struct make_index_sequence
    : concat<typename make_index_sequence<N / 2>::type,
             typename make_index_sequence<N - N / 2>::type>::type {};
template <> struct make_index_sequence<0> : my_index_sequence<> {};
template <> struct make_index_sequence<1> : my_index_sequence<0> {};
} // namespace my_index_sequence_detail

template <class... A>
using my_index_sequence_for =
    typename my_index_sequence_detail::make_index_sequence<sizeof...(A)>::type;

template <class T, size_t... I>
void print_tuple(ostream &s, T const &a, my_index_sequence<I...>) {
  using swallow = int[];
  (void)swallow{0, (void(s << (I == 0 ? "" : ", ") << get<I>(a)), 0)...};
}

template <class T> ostream &print_collection(ostream &s, T const &a) {
  s << '[';
  for (auto it = begin(a); it != end(a); ++it) {
    s << *it;
    if (it != prev(end(a)))
      s << " ";
  }
  return s << ']';
}

template <class... A> ostream &operator<<(ostream &s, tpl<A...> const &a) {
  s << '(';
  print_tuple(s, a, my_index_sequence_for<A...>{});
  return s << ')';
}

template <class... A> ostream &operator<<(ostream &s, tuple<A...> const &a) {
  s << '(';
  print_tuple(s, a, my_index_sequence_for<A...>{});
  return s << ')';
}

template <class A, class B>
ostream &operator<<(ostream &s, pair<A, B> const &a) {
  return s << "(" << get<0>(a) << ", " << get<1>(a) << ")";
}

template <class T, size_t I>
ostream &operator<<(ostream &s, array<T, I> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, vector<T> const &a) {
  return print_collection(s, a);
}
template <class T, class U>
ostream &operator<<(ostream &s, multimap<T, U> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, multiset<T> const &a) {
  return print_collection(s, a);
}
template <class T, class U>
ostream &operator<<(ostream &s, map<T, U> const &a) {
  return print_collection(s, a);
}
template <class T> ostream &operator<<(ostream &s, set<T> const &a) {
  return print_collection(s, a);
}

namespace std {
namespace {
template <class T> inline void hash_combine(size_t &seed, T const &v) {
  seed ^= hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
template <class Tuple, size_t Index = tuple_size<Tuple>::value - 1>
struct HashValueImpl {
  static void apply(size_t &seed, Tuple const &tuple) {
    HashValueImpl<Tuple, Index - 1>::apply(seed, tuple);
    hash_combine(seed, get<Index>(tuple));
  }
};
template <class Tuple> struct HashValueImpl<Tuple, 0> {
  static void apply(size_t &seed, Tuple const &tuple) {
    hash_combine(seed, get<0>(tuple));
  }
};
} // namespace
template <typename... TT> struct hash<tuple<TT...>> {
  size_t operator()(tuple<TT...> const &tt) const {
    size_t seed = 0;
    HashValueImpl<tuple<TT...>>::apply(seed, tt);
    return seed;
  }
};
template <typename... TT> struct hash<tpl<TT...>> {
  size_t operator()(tpl<TT...> const &tt) const {
    size_t seed = 0;
    HashValueImpl<tuple<TT...>>::apply(seed, tt);
    return seed;
  }
};
} // namespace std

int read_positive() {
  char c;
  int x = 0;
  do {
    c = getchar();
  } while (c < '0' || c > '9');
  while (c >= '0' && c <= '9') {
    x = 10 * x + (c - '0');
    c = getchar();
  }
  return x;
}

//------------------------------------------------------------------------------

// --- BEGIN SNIPPET PRIMES ---

const int MAXPRIME = 1000000;
vi primes;
bool sieve[MAXPRIME + 1];
int divv[MAXPRIME + 1];

void calcPrimes() {
  FORU(i, 2, MAXPRIME) sieve[i] = 1;
  FORU(i, 2, MAXPRIME) if (sieve[i]) {
    primes.pb(i);
    divv[i] = i;
    int k = 2;
    while (i * k <= MAXPRIME) {
      if (sieve[i * k])
        divv[i * k] = i;
      sieve[i * k] = 0;
      k += 1;
    }
  }
}

vi divvisors(lli x) {
  assert(primes.size());
  vi r;
  while (x > 1) {
    r.pb(divv[x]);
    x /= divv[x];
  }
  return r;
}

// --- END SNIPPET PRIMES ---

int main(int, char **) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  vi A(n);
  FOR(i, n) cin >> A[i];
  lli ans = 0;
  lli cur = 0;
  lli t = 1;
  while (1) {
    while (cur < n && A[cur] < t)
      cur += 1;
    if (cur == n) {
      break;
    }
    int d = (A[cur] - 1) / t;
    ans += d;
    if (d)
      A[cur] = 1;
    t = max<lli>(t, A[cur] + 1);
  }
  lli ans0 = ans;
  cout << ans0 << endl;
  return 0;
}