Problem p02574 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;

#define typeof(x) __typeof__(x)
#define bit(x, i) (x & (1 << i))          // select the bit of position i of x
#define lowbit(x) ((x) & ((x) ^ ((x)-1))) // get the lowest bit of x
#define hBit(msb, n)                                                           \\
  asm("bsrl %1,%0"                                                             \\
      : "=r"(msb)                                                              \\
      : "r"(n)) // get the highest bit of x, maybe the fastest
#define max(a, b) (a < b ? b : a)
// #define abs(x) (x<0?(-x):x) // big bug here if "-x" is not surrounded by "()"
#define IN(i, l, r) (l < i && i < r) // the next for are for checking bound
#define LINR(i, l, r) (l <= i && i <= r)
#define LIN(i, l, r) (l <= i && i < r)
#define INR(i, l, r) (l < i && i <= r)
#define F(i, L, R) for (int i = L; i < R; i++) // next four are for "for loops"
#define FIN(i, L, R) for (int i = L; i <= R; i++)
#define FF(i, L, R) for (int i = L; i > R; i--)
#define FFIN(i, L, R) for (int i = L; i >= R; i--)
#define getI(a)                                                                \\
  scanf("%d", &a) // next three are handy ways to get ints, it's also force you
                  // to use '&' sign
#define getII(a, b) scanf("%d%d", &a, &b)
#define getIII(a, b, c) scanf("%d%d%d", &a, &b, &c)

#define getLL(a) scanf("%lld", &a)
#define g_s(n)                                                                 \\
  int(n);                                                                      \\
  scanf(                                                                       \\
      "%d",                                                                    \\
      &(n)) // handy if the input is right after the definition of a variable
#define g_s2(n, m)                                                             \\
  int(n), (m);                                                                 \\
  scanf("%d %d", &(n), &(m))
#define g_s3(n, m, k)                                                          \\
  int(n), (m), (k);                                                            \\
  scanf("%d %d %d", &(n), &(m), &(k))
#define TESTS                                                                  \\
  g_s(testow);                                                                 \\
  while (testow--) // for multilple cases problems
#define whileZ                                                                 \\
  int T;                                                                       \\
  getI(T);                                                                     \\
  while (T--)                             // the same as above
#define getS(x) scanf("%s", x)            // get a char* string
#define MEM(a, x) memset(a, x, sizeof(a)) // set elements of array to some value
#define char2Int(c) (c - '0')
#define lastEle(vec) vec[vec.size() - 1]
#define SZ(x) ((int)((x).size()))
#define REMAX(a, b) (a) = max((a), (b)) // set a to the maximum of a and b
#define REMIN(a, b) (a) = min((a), (b));
#define FOREACH(i, t)                                                          \\
  for (typeof(t.begin()) i = t.begin(); i != t.end();                          \\
       i++)                           // traverse an STL data structure
#define ALL(c) (c).begin(), (c).end() // handy for function like "sort()"
#define PRESENT(c, x) ((c).find(x) != (c).end())
#define CPRESENT(c, x) (find(ALL(c), x) != (c).end())
#define ll                                                                     \\
  long long // data types used often, but you don't want to type them time by
            // time
#define ull unsigned long long
#define ui unsigned int
#define us unsigned short
#define IOS                                                                    \\
  ios_base::sync_with_stdio(0); // to synchronize the input of cin and scanf
#define INF 1001001001
#define PI 3.1415926535897932384626
// for map, pair
#define mp make_pair
#define fi first
#define se second
// for debug
inline void pisz(int n) { printf("%d\\n", n); }
#define DBG(vari) cerr << #vari << " = " << (vari) << endl;
#define printA(a, L, R) FIN(jk, L, R) cout << a[jk] << (jk == R ? '\\n' : ' ')
#define printV(a) printA(a, 0, a.size() - 1)

#define sf scanf
#define pf printf
// for vectors
#define pb push_back
typedef int elem_t;
typedef vector<int> vi;
typedef vector<string> vstr;
typedef vector<set<int>> vset;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef pair<int, int> ii;
typedef vector<ii> vii;
// directions
const int dr[4] = {-1, 0, 1, 0};
const int dc[4] = {0, -1, 0, 1};
const int drr[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dcc[8] = {0, -1, -1, -1, 0, 1, 1, 1};
template <typename T, typename TT>
ostream &operator<<(ostream &s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T> ostream &operator<<(ostream &s, vector<T> t) {
  F(i, 0, SZ(t)) s << t[i] << " ";
  return s;
}

#define MAXN 2100000

class UnionFind {
private:
  vi rank, p;

public:
  UnionFind(int n) {
    F(i, 0, n) p.pb(i);
    rank.assign(n, 0);
  }

  int findSet(int s) { return (p[s] == s) ? s : (p[s] = findSet(p[s])); }

  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }

  void unionSet(int i, int j) {
    if (isSameSet(i, j))
      return;

    int x = findSet(i), y = findSet(j);
    if (rank[x] > rank[y])
      p[y] = x;
    else {
      p[x] = y;
      if (rank[x] == rank[y])
        rank[y]++;
    }
  }
};

double x_y(int x1, int y1, int x2, int y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int spf[MAXN];
set<int> fl;

// Calculating SPF (Smallest Prime Factor) for every
// number till MAXN.
// Time Complexity : O(nloglogn)
void sieve() {
  spf[1] = 1;
  for (int i = 2; i < MAXN; i++)

    // marking smallest prime factor for every
    // number to be itself.
    spf[i] = i;

  // separately marking spf for every even
  // number as 2
  for (int i = 4; i < MAXN; i += 2)
    spf[i] = 2;

  for (int i = 3; i * i < MAXN; i++) {
    // checking if i is prime
    if (spf[i] == i) {
      // marking SPF for all numbers divisible by i
      for (int j = i * i; j < MAXN; j += i)

        // marking spf[j] if it is not
        // previously marked
        if (spf[j] == j)
          spf[j] = i;
    }
  }
}

// A O(log n) function returning primefactorization
// by dividing by smallest prime factor at every step
bool ck(int x) {
  set<int> ret;
  while (x != 1) {

    if (fl.find(spf[x]) != fl.end() && ret.find(spf[x]) == ret.end()) {
      // cout<<spf[x]<<endl;

      return false;
    }
    ret.insert(spf[x]);
    fl.insert(spf[x]);
    if (spf[x] == 0)
      return true;
    x = x / spf[x];
  }
  return true;
}

int main() {
  // ios::sync_with_stdio(false);
  // cin.tie(nullptr);
  // sieve(1000010);
  // cout<<primes.size()<<endl;
  sieve();
  g_s(n);
  int pw = 1, dt[n], gc;

  F(i, 0, n) {
    getI(dt[i]);
    if (!ck(dt[i]))
      pw = 0;
    if (i == 0)
      gc = dt[i];
    else
      gc = __gcd(gc, dt[i]);
  }

  if (pw)
    cout << "pairwise coprime" << endl;
  else if (gc == 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define typeof(x) __typeof__(x)
#define bit(x, i) (x & (1 << i))          // select the bit of position i of x
#define lowbit(x) ((x) & ((x) ^ ((x)-1))) // get the lowest bit of x
#define hBit(msb, n)                                                           \\
  asm("bsrl %1,%0"                                                             \\
      : "=r"(msb)                                                              \\
      : "r"(n)) // get the highest bit of x, maybe the fastest
#define max(a, b) (a < b ? b : a)
// #define abs(x) (x<0?(-x):x) // big bug here if "-x" is not surrounded by "()"
#define IN(i, l, r) (l < i && i < r) // the next for are for checking bound
#define LINR(i, l, r) (l <= i && i <= r)
#define LIN(i, l, r) (l <= i && i < r)
#define INR(i, l, r) (l < i && i <= r)
#define F(i, L, R) for (int i = L; i < R; i++) // next four are for "for loops"
#define FIN(i, L, R) for (int i = L; i <= R; i++)
#define FF(i, L, R) for (int i = L; i > R; i--)
#define FFIN(i, L, R) for (int i = L; i >= R; i--)
#define getI(a)                                                                \\
  scanf("%d", &a) // next three are handy ways to get ints, it's also force you
                  // to use '&' sign
#define getII(a, b) scanf("%d%d", &a, &b)
#define getIII(a, b, c) scanf("%d%d%d", &a, &b, &c)

#define getLL(a) scanf("%lld", &a)
#define g_s(n)                                                                 \\
  int(n);                                                                      \\
  scanf(                                                                       \\
      "%d",                                                                    \\
      &(n)) // handy if the input is right after the definition of a variable
#define g_s2(n, m)                                                             \\
  int(n), (m);                                                                 \\
  scanf("%d %d", &(n), &(m))
#define g_s3(n, m, k)                                                          \\
  int(n), (m), (k);                                                            \\
  scanf("%d %d %d", &(n), &(m), &(k))
#define TESTS                                                                  \\
  g_s(testow);                                                                 \\
  while (testow--) // for multilple cases problems
#define whileZ                                                                 \\
  int T;                                                                       \\
  getI(T);                                                                     \\
  while (T--)                             // the same as above
#define getS(x) scanf("%s", x)            // get a char* string
#define MEM(a, x) memset(a, x, sizeof(a)) // set elements of array to some value
#define char2Int(c) (c - '0')
#define lastEle(vec) vec[vec.size() - 1]
#define SZ(x) ((int)((x).size()))
#define REMAX(a, b) (a) = max((a), (b)) // set a to the maximum of a and b
#define REMIN(a, b) (a) = min((a), (b));
#define FOREACH(i, t)                                                          \\
  for (typeof(t.begin()) i = t.begin(); i != t.end();                          \\
       i++)                           // traverse an STL data structure
#define ALL(c) (c).begin(), (c).end() // handy for function like "sort()"
#define PRESENT(c, x) ((c).find(x) != (c).end())
#define CPRESENT(c, x) (find(ALL(c), x) != (c).end())
#define ll                                                                     \\
  long long // data types used often, but you don't want to type them time by
            // time
#define ull unsigned long long
#define ui unsigned int
#define us unsigned short
#define IOS                                                                    \\
  ios_base::sync_with_stdio(0); // to synchronize the input of cin and scanf
#define INF 1001001001
#define PI 3.1415926535897932384626
// for map, pair
#define mp make_pair
#define fi first
#define se second
// for debug
inline void pisz(int n) { printf("%d\\n", n); }
#define DBG(vari) cerr << #vari << " = " << (vari) << endl;
#define printA(a, L, R) FIN(jk, L, R) cout << a[jk] << (jk == R ? '\\n' : ' ')
#define printV(a) printA(a, 0, a.size() - 1)
#define MAXN 10000
#define sf scanf
#define pf printf
// for vectors
#define pb push_back
typedef int elem_t;
typedef vector<int> vi;
typedef vector<string> vstr;
typedef vector<set<int>> vset;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef pair<int, int> ii;
typedef vector<ii> vii;
// directions
const int dr[4] = {-1, 0, 1, 0};
const int dc[4] = {0, -1, 0, 1};
const int drr[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dcc[8] = {0, -1, -1, -1, 0, 1, 1, 1};
template <typename T, typename TT>
ostream &operator<<(ostream &s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T> ostream &operator<<(ostream &s, vector<T> t) {
  F(i, 0, SZ(t)) s << t[i] << " ";
  return s;
}

#define MAXN 1000000

class UnionFind {
private:
  vi rank, p;

public:
  UnionFind(int n) {
    F(i, 0, n) p.pb(i);
    rank.assign(n, 0);
  }

  int findSet(int s) { return (p[s] == s) ? s : (p[s] = findSet(p[s])); }

  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }

  void unionSet(int i, int j) {
    if (isSameSet(i, j))
      return;

    int x = findSet(i), y = findSet(j);
    if (rank[x] > rank[y])
      p[y] = x;
    else {
      p[x] = y;
      if (rank[x] == rank[y])
        rank[y]++;
    }
  }
};

double x_y(int x1, int y1, int x2, int y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int spf[MAXN];
set<int> fl;

// Calculating SPF (Smallest Prime Factor) for every
// number till MAXN.
// Time Complexity : O(nloglogn)
void sieve() {
  spf[1] = 1;
  for (int i = 2; i < MAXN; i++)

    // marking smallest prime factor for every
    // number to be itself.
    spf[i] = i;

  // separately marking spf for every even
  // number as 2
  for (int i = 4; i < MAXN; i += 2)
    spf[i] = 2;

  for (int i = 3; i * i < MAXN; i++) {
    // checking if i is prime
    if (spf[i] == i) {
      // marking SPF for all numbers divisible by i
      for (int j = i * i; j < MAXN; j += i)

        // marking spf[j] if it is not
        // previously marked
        if (spf[j] == j)
          spf[j] = i;
    }
  }
}

// A O(log n) function returning primefactorization
// by dividing by smallest prime factor at every step
bool ck(int x) {
  set<int> ret;
  while (x != 1) {

    if (fl.find(spf[x]) != fl.end() && ret.find(spf[x]) == ret.end()) {
      // cout<<spf[x]<<endl;

      return false;
    }
    ret.insert(spf[x]);
    fl.insert(spf[x]);
    x = x / spf[x];
  }
  return true;
}

int main() {
  // ios::sync_with_stdio(false);
  // cin.tie(nullptr);
  // sieve(1000010);
  // cout<<primes.size()<<endl;
  sieve();
  g_s(n);
  int pw = 1, sw = 1, dt[n], gc;

  F(i, 0, n) {
    getI(dt[i]);
    if (!ck(dt[i]))
      pw = 0;
    if (!i)
      gc = dt[i];
    else
      gc = __gcd(gc, dt[i]);
  }

  if (pw)
    cout << "pairwise coprime" << endl;
  else if (gc == 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;

  return 0;
}