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

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define cinf(n, x)                                                             \\
  for (int i = 0; i < (n); i++)                                                \\
    cin >> x[i];
#define ft first
#define sc second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define LB(a, x) lb(all(a), x) - a.begin()
#define UB(a, x) ub(all(a), x) - a.begin()
#define mod 1000000007
// #define mod 998244353
#define FS fixed << setprecision(15)
using namespace std;
typedef long long ll;
const double pi = 3.141592653589793;
template <class T> using V = vector<T>;
using Graph = vector<vector<int>>;
using P = pair<ll, ll>;
typedef unsigned long long ull;
typedef long double ldouble;
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline void out(T a) { cout << a << '\\n'; }
void YN(bool ok) {
  if (ok)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
// void YN(bool ok){if(ok) cout << "YES" << endl; else cout << "NO" << endl;}

const ll INF = 1e18;
const int mx = 200005;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll n;
  cin >> n;
  V<ll> a(n);
  cinf(n, a);
  ll g = a[0];
  for (int i = 1; i < n; i++)
    g = __gcd(g, a[i]);
  sort(all(a));
  bool ok = 1;
  V<bool> p(1000001, 1);
  V<ll> pp;
  ll ma = *max_element(all(a));
  V<ll> mp(1000001, 0);
  rep(i, n) mp[a[i]]++;

  for (ll i = 2; i <= 1000000; i++) {
    if (i > ma)
      break;
    if (p[i]) {
      // if(!st.count(i))
      int cnt = 0;
      if (mp[i] > 0)
        cnt += mp[i];
      for (ll j = 2 * i; j <= 1000000; j += i) {
        if (j > ma)
          break;
        p[j] = 0;
        if (mp[j] > 0)
          cnt += mp[j];
      }
      if (cnt > 1)
        ok = 0;
    }
  }
  /*ll ma=*max_element(all(a));
  for(ll cur:pp){
      if(cur>ma) break;
      ll cnt=0;
      rep(j,n){
          if(a[j]%cur==0) cnt++;
      }
      if(cnt>1) ok=0;

  }*/
  if (ok)
    out("pairwise coprime");
  else if (g == 1)
    out("setwise coprime");
  else
    out("not coprime");
}
// ペナルティ出しても焦らない　ACできると信じろ！！！
// どうしてもわからないときはサンプルで実験　何か見えてくるかも
// 頭で考えてダメなら紙におこせ！！
/*
V,P(大文字)使用不可
乗算などの際にオーバーフローに注意せよ！
(適切にmodをとれ　にぶたんで途中で切り上げろ)
制約をよく読め！
{
    ・全探索できるなら全探索しろ
    ・異常な制約ならそこに注目
}
stringの計算量(扱い)注意
コーナー注意！(特に数値が小さいものについては要検証)
N行出力のときは'¥n'
グリッド上では行先が範囲内におさまるかif文で確認(RE注意)
if文ではちゃんと比較演算子==を使え('='でもエラー出ない)
配列(vector)の大きさが0か1以上かで場合分けせよ(RE注意)
(vector<int> a(m)でm==0というものはできない)
modはなるべく最後に取れ！
doubleを扱うときには(abs)ではなく'fabs'!!!
*/

Error: TLE

Fixed submission:

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define cinf(n, x)                                                             \\
  for (int i = 0; i < (n); i++)                                                \\
    cin >> x[i];
#define ft first
#define sc second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define LB(a, x) lb(all(a), x) - a.begin()
#define UB(a, x) ub(all(a), x) - a.begin()
#define mod 1000000007
// #define mod 998244353
#define FS fixed << setprecision(15)
using namespace std;
typedef long long ll;
const double pi = 3.141592653589793;
template <class T> using V = vector<T>;
using Graph = vector<vector<int>>;
using P = pair<ll, ll>;
typedef unsigned long long ull;
typedef long double ldouble;
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline void out(T a) { cout << a << '\\n'; }
void YN(bool ok) {
  if (ok)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
// void YN(bool ok){if(ok) cout << "YES" << endl; else cout << "NO" << endl;}

const ll INF = 1e18;
const int mx = 200005;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll n;
  cin >> n;
  V<ll> a(n);
  cinf(n, a);
  ll g = a[0];
  for (int i = 1; i < n; i++)
    g = __gcd(g, a[i]);
  sort(all(a));
  bool ok = 1;
  V<bool> p(1000001, 1);
  V<ll> pp;
  for (ll i = 2; i <= 1000000; i++) {
    if (p[i]) {
      pp.pb(i);
      for (ll j = 2 * i; j <= 1000000; j += i) {
        p[j] = 0;
      }
    }
  }
  ll ma = *max_element(all(a));
  for (ll cur : pp) {
    if (cur > ma)
      break;
    ll cnt = 0;
    rep(j, n) {
      if (a[j] % cur == 0)
        cnt++;
    }
    if (cnt > 1)
      ok = 0;
  }
  if (ok)
    out("pairwise coprime");
  else if (g == 1)
    out("setwise coprime");
  else
    out("not coprime");
}
// ペナルティ出しても焦らない　ACできると信じろ！！！
// どうしてもわからないときはサンプルで実験　何か見えてくるかも
// 頭で考えてダメなら紙におこせ！！
/*
V,P(大文字)使用不可
乗算などの際にオーバーフローに注意せよ！
(適切にmodをとれ　にぶたんで途中で切り上げろ)
制約をよく読め！
{
    ・全探索できるなら全探索しろ
    ・異常な制約ならそこに注目
}
stringの計算量(扱い)注意
コーナー注意！(特に数値が小さいものについては要検証)
N行出力のときは'¥n'
グリッド上では行先が範囲内におさまるかif文で確認(RE注意)
if文ではちゃんと比較演算子==を使え('='でもエラー出ない)
配列(vector)の大きさが0か1以上かで場合分けせよ(RE注意)
(vector<int> a(m)でm==0というものはできない)
modはなるべく最後に取れ！
doubleを扱うときには(abs)ではなく'fabs'!!!
*/