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

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 1001001001;
const ll mod = 1000000007;
const int MAX = 1000100;
/**
 * caution : set MAX to the proper value
 * caution : don't forget to use Sieve
 **/
bool Is_prime[MAX];
int MinFactor[MAX];
// Eratosthenes's Sieve
// O(NloglogN)
void Sieve(int n = MAX) {
  for (int i = 0; i < n; ++i)
    Is_prime[i] = true, MinFactor[i] = -1;
  Is_prime[0] = false;
  Is_prime[1] = false;
  MinFactor[0] = 0;
  MinFactor[1] = 1;
  for (int i = 2; i < n; ++i) {
    if (Is_prime[i]) {
      MinFactor[i] = i;
      for (int j = 2 * i; j < n; j += i) {
        Is_prime[j] = false;
        if (MinFactor[j] == -1)
          MinFactor[j] = i;
      }
    }
  }
}
// Factorization O(logN)
vector<pair<int, int>> prime_factor(int n) {
  vector<pair<int, int>> res;
  while (n != 1) {
    int prime = MinFactor[n];
    int exp = 0;
    while (MinFactor[n] == prime) {
      ++exp;
      n /= prime;
    }
    res.push_back(make_pair(prime, exp));
  }
  return res;
}

int gcd(int a, int b) { return (b == 0 ? a : gcd(b, a % b)); }

int main() {
  int n;
  cin >> n;
  Sieve();
  vector<int> a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];
  int full = a[0];
  for (int i = 1; i < n; i++) {
    full = gcd(a[i], full);
  }
  bool one = true;
  vector<int> d(1000001, 0);
  for (int i = 0; i < n; i++) {
    auto pf = prime_factor(a[i]);
    for (auto p : pf) {
      d[p.first]++;
    }
  }
  if (*max_element(d.begin(), d.end()) >= 2)
    one = false;
  if (one)
    cout << "pairwise coprime" << endl;
  else if (full == 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 1001001001;
const ll mod = 1000000007;
const int MAX = 1000100;
/**
 * caution : set MAX to the proper value
 * caution : don't forget to use Sieve
 **/
bool Is_prime[MAX];
int MinFactor[MAX];
// Eratosthenes's Sieve
// O(NloglogN)
void Sieve(int n = MAX) {
  for (int i = 0; i < n; ++i)
    Is_prime[i] = true, MinFactor[i] = -1;
  Is_prime[0] = false;
  Is_prime[1] = false;
  MinFactor[0] = 0;
  MinFactor[1] = 1;
  for (int i = 2; i * i < n; ++i) {
    if (Is_prime[i]) {
      MinFactor[i] = i;
      for (int j = i * i; j < n; j += i) {
        Is_prime[j] = false;
        if (MinFactor[j] == -1)
          MinFactor[j] = i;
      }
    }
  }
}
// Factorization O(logN)
vector<pair<int, int>> prime_factor(int n) {
  vector<pair<int, int>> res;
  while (n != 1) {
    int prime = MinFactor[n];
    int exp = 0;
    while (MinFactor[n] == prime) {
      ++exp;
      n /= prime;
    }
    res.push_back(make_pair(prime, exp));
  }
  return res;
}

int gcd(int a, int b) { return (b == 0 ? a : gcd(b, a % b)); }

int main() {
  int n;
  cin >> n;
  Sieve();
  vector<int> a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];
  int full = a[0];
  for (int i = 1; i < n; i++) {
    full = gcd(a[i], full);
  }
  bool one = true;
  vector<int> d(1000001, 0);
  for (int i = 0; i < n; i++) {
    auto pf = prime_factor(a[i]);
    for (auto p : pf) {
      d[p.first]++;
    }
  }
  if (*max_element(d.begin(), d.end()) >= 2)
    one = false;
  if (one)
    cout << "pairwise coprime" << endl;
  else if (full == 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;
}