Problem p02642 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;
#define forn(a, e) for (i64 a = 0; a < (i64)(e); a++)
#define forr(a, s, e) for (i64 a = s; a < (i64)(e); a++)
#define fore(e, a) for (auto &e : a)

#ifdef LOCAL
#define logv(a)                                                                \
  {                                                                            \
    cerr << #a << " = ";                                                       \
    fore(e, a) { cerr << e << " "; }                                           \
    cerr << "\n";                                                              \
  }
#define logvp(a)                                                               \
  {                                                                            \
    cerr << #a << " = ";                                                       \
    fore(e, a) { cerr << "(" << e.first << ", " << e.second << ") "; }         \
    cerr << "\n";                                                              \
  }
#define logvv(a)                                                               \
  {                                                                            \
    cerr << #a << " = \n";                                                     \
    fore(r, a) {                                                               \
      fore(e, r) { cerr << e << " "; }                                         \
      cerr << "\n";                                                            \
    }                                                                          \
  }
#define logvf(a, field)                                                        \
  {                                                                            \
    cerr << #a "." #field << " = \n";                                          \
    fore(e, a) { cerr << e.field << " "; }                                     \
    cerr << "\n";                                                              \
  }
#define logvff(a, f1, f2)                                                      \
  {                                                                            \
    cerr << #a ".{" #f1 << ", " #f2 << "} = \n";                               \
    fore(e, a) { cerr << "(" << e.f1 << ", " << e.f2 << ") "; }                \
    cerr << "\n";                                                              \
  }
#define logs(a) cerr << #a << " = " << (a) << "\n";
#define logss(a, b)                                                            \
  cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\n";
#define logp(a)                                                                \
  cerr << #a << " = "                                                          \
       << "(" << a.first << ", " << a.second << ")"                            \
       << "\n";
#define cond(pred, stmt)                                                       \
  if (pred) {                                                                  \
    stmt                                                                       \
  }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif

using iip = pair<int, int>;
using llp = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template <typename T> using vec = vector<T>;

template <typename T, typename Dim> auto make_vec(T value, Dim dim) {
  return vector<T>(dim, value);
}
template <typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) {
  return make_vec(make_vec(value, dims...), dim1);
}

template <typename T> bool uax(T &v, const T &newv) {
  if (v < newv) {
    v = newv;
    return true;
  } else
    return false;
}
template <typename T> bool uin(T &v, const T &newv) {
  if (v > newv) {
    v = newv;
    return true;
  } else
    return false;
}

template <typename T> istream &operator>>(istream &is, vector<T> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}
template <typename T, size_t N>
istream &operator>>(istream &is, array<T, N> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}

template <typename... T> istream &read(T &...args) {
  return (cin >> ... >> args);
}

static mt19937 rande(123123);
template <typename T> T rand_int(T from, T to) {
  uniform_int_distribution<T> distr(from, to);
  return distr(rande);
}

constexpr int INF = 1e9;
constexpr int MXB = 20;
using bin = bitset<MXB>;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  rande.seed(chrono::steady_clock::now().time_since_epoch().count());

  int n;
  while (read(n)) {
    ivec a(n);
    read(a);

    ivec fail(n);

    map<int, ivec> divs;
    forn(i, n) {
      for (int j = 1; j * j <= a[i]; j++) {
        if (a[i] % j == 0) {
          divs[j].push_back(i);
          divs[a[i] / j].push_back(i);
        }
      }
    }

    forn(i, n) {
      fore(d, divs[a[i]]) if (d != i) { fail[d] = true; }
    }

    int cc = 0;
    forn(i, n) { cc += !fail[i]; }
    cout << cc << endl;
  }
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;
#define forn(a, e) for (i64 a = 0; a < (i64)(e); a++)
#define forr(a, s, e) for (i64 a = s; a < (i64)(e); a++)
#define fore(e, a) for (auto &e : a)

#ifdef LOCAL
#define logv(a)                                                                \
  {                                                                            \
    cerr << #a << " = ";                                                       \
    fore(e, a) { cerr << e << " "; }                                           \
    cerr << "\n";                                                              \
  }
#define logvp(a)                                                               \
  {                                                                            \
    cerr << #a << " = ";                                                       \
    fore(e, a) { cerr << "(" << e.first << ", " << e.second << ") "; }         \
    cerr << "\n";                                                              \
  }
#define logvv(a)                                                               \
  {                                                                            \
    cerr << #a << " = \n";                                                     \
    fore(r, a) {                                                               \
      fore(e, r) { cerr << e << " "; }                                         \
      cerr << "\n";                                                            \
    }                                                                          \
  }
#define logvf(a, field)                                                        \
  {                                                                            \
    cerr << #a "." #field << " = \n";                                          \
    fore(e, a) { cerr << e.field << " "; }                                     \
    cerr << "\n";                                                              \
  }
#define logvff(a, f1, f2)                                                      \
  {                                                                            \
    cerr << #a ".{" #f1 << ", " #f2 << "} = \n";                               \
    fore(e, a) { cerr << "(" << e.f1 << ", " << e.f2 << ") "; }                \
    cerr << "\n";                                                              \
  }
#define logs(a) cerr << #a << " = " << (a) << "\n";
#define logss(a, b)                                                            \
  cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\n";
#define logp(a)                                                                \
  cerr << #a << " = "                                                          \
       << "(" << a.first << ", " << a.second << ")"                            \
       << "\n";
#define cond(pred, stmt)                                                       \
  if (pred) {                                                                  \
    stmt                                                                       \
  }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif

using iip = pair<int, int>;
using llp = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template <typename T> using vec = vector<T>;

template <typename T, typename Dim> auto make_vec(T value, Dim dim) {
  return vector<T>(dim, value);
}
template <typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) {
  return make_vec(make_vec(value, dims...), dim1);
}

template <typename T> bool uax(T &v, const T &newv) {
  if (v < newv) {
    v = newv;
    return true;
  } else
    return false;
}
template <typename T> bool uin(T &v, const T &newv) {
  if (v > newv) {
    v = newv;
    return true;
  } else
    return false;
}

template <typename T> istream &operator>>(istream &is, vector<T> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}
template <typename T, size_t N>
istream &operator>>(istream &is, array<T, N> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}

template <typename... T> istream &read(T &...args) {
  return (cin >> ... >> args);
}

static mt19937 rande(123123);
template <typename T> T rand_int(T from, T to) {
  uniform_int_distribution<T> distr(from, to);
  return distr(rande);
}

constexpr int INF = 1e9;
constexpr int MXB = 20;
using bin = bitset<MXB>;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  rande.seed(chrono::steady_clock::now().time_since_epoch().count());

  int n;
  while (read(n)) {
    ivec a(n);
    read(a);

    ivec fail(n);

    map<int, ivec> divs;
    forn(i, n) {
      for (int j = 1; j * j <= a[i]; j++) {
        if (a[i] % j == 0) {
          divs[j].push_back(i);
          divs[a[i] / j].push_back(i);
        }
      }
    }

    forn(i, n) {
      fore(d, divs[a[i]]) if (d != i) { fail[d] = true; }
      divs[a[i]] = {int(i)};
    }

    int cc = 0;
    forn(i, n) { cc += !fail[i]; }
    cout << cc << endl;
  }
}