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

#include <bits/stdc++.h> // This will work only for g++ compiler.
#include <ext/pb_ds/assoc_container.hpp> // Used to include policy based data structure
using namespace __gnu_pbds;              // Only for g++ compiler
using namespace std;

#define for0(i, n) for (int i = 0; i < (int)(n); ++i)  // 0 based indexing
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i) // 1 based indexing
#define forc(i, l, r)                                                          \\
  for (int i = (int)(l); i <= (int)(r);                                        \\
       ++i) // closed interver from l to r r inclusive
#define forr0(i, n) for (int i = (int)(n)-1; i >= 0; --i) // reverse 0 based.
#define forr1(i, n) for (int i = (int)(n); i >= 1; --i)   // reverse 1 based
#define max(a, b) (a > b) ? a : b                         // max of 2 elements
#define min(a, b) (a < b) ? a : b                         // min of 2 elements

// short hand for usual tokens
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define mii map<int, int>
#define pqb priority_queue<int>                   // Max Heap
#define pqs priority_queue<int, vi, greater<int>> // Min Heap
#define setbits(x)                                                             \\
  __builtin_popcountll(                                                        \\
      x) // returns the number of set bits in the binary representation of x
#define zrobits(x)                                                             \\
  __builtin_ctzll(x) // returns the number of zeroes before the first set bit in
                     // the binary representation of x
#define mod 1000000007                            // 1e9 + 7
#define inf 1e18                                  // pow(10, 18)
#define mk(arr, n, type) type *arr = new type[n]; // generates a dynamic array
#define w(x)                                                                   \\
  int x;                                                                       \\
  cin >> x;                                                                    \\
  while (x--) // for taking test cases
mt19937 rng(chrono::steady_clock::now()
                .time_since_epoch()
                .count()); // used with shuffle

// to be used with algorithms that processes a container Eg: find(all(c),42)
#define all(x) (x).begin(), (x).end()  // Forward traversal
#define rall(x) (x).rbegin, (x).rend() // reverse traversal

// traversal function to avoid long template definition. Now with C++11 auto
// alleviates the pain.
#define tr(c, i)                                                               \\
  for (__typeof__((c)).begin() i = (c).begin(); i != (c).end(); i++)

// find if a given value is present in a container. Container version. Runs in
// log(n) for set and map
#define present(c, x) ((c).find(x) != (c).end())

// find version works for all containers. This is present in std namespace.
#define cpresent(c, x) (find(all(c), x) != (c).end())

// Avoiding wrap around of size()-1 where size is a unsigned int.
#define sz(a) int((a).size())

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds; // Used to implement policy-based data structure

// Shorthand for commonly used types
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;

ll moduloMultiplication(ll a, ll b) {
  ll res = 0;
  a %= mod;

  while (b) {
    if (b & 1)
      res = (res + a) % mod;

    a = (2 * a) % mod;
    b >>= 1;
  }

  return res;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(10);
  cout << fixed;

  int n;
  cin >> n;
  vi arr(n);
  int gcd = 0;
  for0(i, n) {
    cin >> arr[i];
    gcd = __gcd(gcd, arr[i]);
  }

  if (gcd > 1) {
    cout << "not coprime";
    return 0;
  }

  vi divs(1000005, 0);
  for (int i = 0; i < n; i++) {
    for (int j = 1; j * j <= arr[i]; j++) {
      if (arr[i] % j == 0) {
        divs[j]++;
        if (j != arr[i] / j)
          divs[arr[i] / j]++;

        if ((divs[j] > 1 && j != 1) ||
            (divs[arr[i] / j] > 1 && arr[i] / j != 1)) {
          cout << "setwise coprime";
          return 0;
        }
      }
    }
  }
  cout << "pairwise coprime";

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h> // This will work only for g++ compiler.
#include <ext/pb_ds/assoc_container.hpp> // Used to include policy based data structure
using namespace __gnu_pbds;              // Only for g++ compiler
using namespace std;

#define for0(i, n) for (int i = 0; i < (int)(n); ++i)  // 0 based indexing
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i) // 1 based indexing
#define forc(i, l, r)                                                          \\
  for (int i = (int)(l); i <= (int)(r);                                        \\
       ++i) // closed interver from l to r r inclusive
#define forr0(i, n) for (int i = (int)(n)-1; i >= 0; --i) // reverse 0 based.
#define forr1(i, n) for (int i = (int)(n); i >= 1; --i)   // reverse 1 based
#define max(a, b) (a > b) ? a : b                         // max of 2 elements
#define min(a, b) (a < b) ? a : b                         // min of 2 elements

// short hand for usual tokens
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define mii map<int, int>
#define pqb priority_queue<int>                   // Max Heap
#define pqs priority_queue<int, vi, greater<int>> // Min Heap
#define setbits(x)                                                             \\
  __builtin_popcountll(                                                        \\
      x) // returns the number of set bits in the binary representation of x
#define zrobits(x)                                                             \\
  __builtin_ctzll(x) // returns the number of zeroes before the first set bit in
                     // the binary representation of x
#define mod 1000000007                            // 1e9 + 7
#define inf 1e18                                  // pow(10, 18)
#define mk(arr, n, type) type *arr = new type[n]; // generates a dynamic array
#define w(x)                                                                   \\
  int x;                                                                       \\
  cin >> x;                                                                    \\
  while (x--) // for taking test cases
mt19937 rng(chrono::steady_clock::now()
                .time_since_epoch()
                .count()); // used with shuffle

// to be used with algorithms that processes a container Eg: find(all(c),42)
#define all(x) (x).begin(), (x).end()  // Forward traversal
#define rall(x) (x).rbegin, (x).rend() // reverse traversal

// traversal function to avoid long template definition. Now with C++11 auto
// alleviates the pain.
#define tr(c, i)                                                               \\
  for (__typeof__((c)).begin() i = (c).begin(); i != (c).end(); i++)

// find if a given value is present in a container. Container version. Runs in
// log(n) for set and map
#define present(c, x) ((c).find(x) != (c).end())

// find version works for all containers. This is present in std namespace.
#define cpresent(c, x) (find(all(c), x) != (c).end())

// Avoiding wrap around of size()-1 where size is a unsigned int.
#define sz(a) int((a).size())

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds; // Used to implement policy-based data structure

// Shorthand for commonly used types
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;

ll moduloMultiplication(ll a, ll b) {
  ll res = 0;
  a %= mod;

  while (b) {
    if (b & 1)
      res = (res + a) % mod;

    a = (2 * a) % mod;
    b >>= 1;
  }

  return res;
}

const int N = 1e6 + 1;
vi is_prime(N, 0);
vi primes;
void sieveofera() {
  for (int i = 2; i < N; i++) {
    is_prime[i] = 1;
  }

  for (int i = 2; i * i <= N; i++) {
    if (is_prime[i]) {
      for (int j = i * i; j < N; j += i) {
        is_prime[j] = 0;
      }
    }
  }
  for (int i = 2; i < N; i++) {
    if (is_prime[i])
      primes.pb(i);
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(10);
  cout << fixed;

  sieveofera();
  int n;
  cin >> n;
  vi arr(n);
  for0(i, n) { cin >> arr[i]; }

  int flag1 = 1, flag2 = 1;
  vi cnts(N, 0);
  for (int i = 0; i < (int)primes.size(); i++) {
    int num = primes[i];
    for (int j = 0; j < n; j++) {
      if (arr[j] % num == 0) {
        cnts[num]++;
        if (cnts[num] > 1)
          flag1 = 0;

        if (cnts[num] == n)
          flag2 = 0;
      }
    }
    if (!flag1 && !flag2)
      break;
  }

  if (flag1) {
    cout << "pairwise coprime";
    return 0;
  }

  if (flag2) {
    cout << "setwise coprime";
    return 0;
  }
  cout << "not coprime";

  return 0;
}