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

#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e18;
const ll MOD = 1e9 + 7;

const ll MAX_A = 1001000;

ll gcd(ll n, ll m) {
  if (n > m) {
    ll l = n;
    n = m;
    m = l;
  }
  if (n == 0) {
    return m;
  }
  while (1) {
    ll l = n;
    n = m % n;
    m = l;
    if (n == 0) {
      break;
    }
  }
  return m;
}

bool isprime(ll n) {
  if (n == 1) {
    return false;
  }
  if (n == 2) {
    return true;
  }
  ll sq = (ll)sqrt(double(n));
  for (ll i = 2; i <= sq; i++) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll i, j, k, l;

  ll N;
  cin >> N;
  vll A(N);
  for (auto &e : A)
    cin >> e;
  // setwise
  ll g = A[0];
  for (i = 1; i < N; i++) {
    g = gcd(g, A[i]);
  }
  if (g > 1) {
    cout << "not coprime" << endl;
    return 0;
  }
  // pairwise
  // D[x]はxを割り切る最小の素数
  vll D(MAX_A, 0);
  for (i = 2; i < D.size(); i++) {
    if (D[i] == 0) {
      ll p = i;
      while (p < D.size()) {
        D[p] = i;
        p += i;
      }
    }
  }
  set<ll> pset;
  for (i = 0; i < N; i++) {
    ll a = A[i];
    if (a == 1)
      continue;
    set<ll> pset_sub;
    while (D[a] != a) {
      auto itr = pset.find(D[a]);
      if (itr != pset.end()) {
        cout << "setwise coprime" << endl;
        return 0;
      }
      pset_sub.insert(D[a]);
      a = a / D[a];
    }
    auto itr = pset.find(a);
    if (itr != pset.end()) {
      cout << "setwise coprime" << endl;
      return 0;
    }
    pset_sub.insert(a);
    for (auto p : pset_sub) {
      pset.insert(p);
    }
  }

  cout << "pairwise coprime" << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e18;
const ll MOD = 1e9 + 7;

const ll MAX_A = 1001000;

ll gcd(ll n, ll m) {
  if (n > m) {
    ll l = n;
    n = m;
    m = l;
  }
  if (n == 0) {
    return m;
  }
  while (1) {
    ll l = n;
    n = m % n;
    m = l;
    if (n == 0) {
      break;
    }
  }
  return m;
}

bool isprime(ll n) {
  if (n == 1) {
    return false;
  }
  if (n == 2) {
    return true;
  }
  ll sq = (ll)sqrt(double(n));
  for (ll i = 2; i <= sq; i++) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll i, j, k, l;

  ll N;
  cin >> N;
  vll A(N);
  for (auto &e : A)
    cin >> e;
  // setwise
  ll g = A[0];
  for (i = 1; i < N; i++) {
    g = gcd(g, A[i]);
  }
  if (g > 1) {
    cout << "not coprime" << endl;
    return 0;
  }
  // pairwise
  // D[x]はxを割り切る最小の素数
  vll D(MAX_A, 0);
  for (i = 2; i < D.size(); i++) {
    if (D[i] == 0) {
      ll p = i;
      while (p < D.size()) {
        D[p] = i;
        p += i;
      }
    }
  }
  set<ll> pset;
  for (i = 0; i < N; i++) {
    ll a = A[i];
    if (a == 1)
      continue;
    set<ll> pset_sub;
    while (D[a] != a) {
      pset_sub.insert(D[a]);
      a = a / D[a];
    }
    pset_sub.insert(a);
    set<ll> common;
    set_intersection(pset.begin(), pset.end(), pset_sub.begin(), pset_sub.end(),
                     inserter(common, common.end()));
    if (common.size() > 0) {
      cout << "setwise coprime" << endl;
      return 0;
    }
    set<ll> pset_new;
    set_union(pset.begin(), pset.end(), pset_sub.begin(), pset_sub.end(),
              inserter(pset_new, pset_new.end()));
    pset = pset_new;
  }

  cout << "pairwise coprime" << endl;

  return 0;
}