Problem p02574 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

std::vector<bool> IsPrime;

void sieve(size_t max) {
  if (max + 1 > IsPrime.size()) {  // resizeで要素数が減らないように
    IsPrime.resize(max + 1, true); // IsPrimeに必要な要素数を確保
  }
  IsPrime[0] = false; // 0は素数ではない
  IsPrime[1] = false; // 1は素数ではない

  for (size_t i = 2; i * i <= max; ++i)     // 0からsqrt(max)まで調べる
    if (IsPrime[i])                         // iが素数ならば
      for (size_t j = 2; i * j <= max; ++j) // (max以下の)iの倍数は
        IsPrime[i * j] = false;             // 素数ではない
}

map<int, int> factorization(int x) {
  map<int, int> pn;
  for (int i = 2; i * i <= x; i++) {
    while (x % i == 0) {
      x /= i;
      pn[i]++;
    }
  }
  if (x != 1)
    pn[x]++;
  return pn;
}

void Main() {
  int n;
  cin >> n;
  int M = 1000000;
  sieve(M);
  // vector<long> sosu;
  // for (int i = 2; i <= M; i++)
  // {
  //     if(IsPrime[i]) sosu.push_back(i);
  // }
  // vector<int> sum(sosu.size());
  vector<int> sum(n + 1);
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    map<int, int> fac = factorization(a);
    // for (int j = 0; j < sosu.size(); j++)
    // {
    //     if(a % sosu[j] == 0) sum[j]++;
    // }
    for (auto j : fac) {
      sum[j.first]++;
    }
  }

  int maxsum = 0;
  for (int i = 0; i < sum.size(); i++) {
    maxsum = max(maxsum, sum[i]);
  }

  if (maxsum <= 1)
    cout << "pairwise coprime" << endl;
  else if (maxsum <= n - 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;
}

int main(int argc, char **argv) {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  Main();
  return 0;
}


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

std::vector<bool> IsPrime;

void sieve(size_t max) {
  if (max + 1 > IsPrime.size()) {  // resizeで要素数が減らないように
    IsPrime.resize(max + 1, true); // IsPrimeに必要な要素数を確保
  }
  IsPrime[0] = false; // 0は素数ではない
  IsPrime[1] = false; // 1は素数ではない

  for (size_t i = 2; i * i <= max; ++i)     // 0からsqrt(max)まで調べる
    if (IsPrime[i])                         // iが素数ならば
      for (size_t j = 2; i * j <= max; ++j) // (max以下の)iの倍数は
        IsPrime[i * j] = false;             // 素数ではない
}

map<int, int> factorization(int x) {
  map<int, int> pn;
  for (int i = 2; i * i <= x; i++) {
    while (x % i == 0) {
      x /= i;
      pn[i]++;
    }
  }
  if (x != 1)
    pn[x]++;
  return pn;
}

void Main() {
  int n;
  cin >> n;
  int M = 1000000;
  sieve(M);
  // vector<long> sosu;
  // for (int i = 2; i <= M; i++)
  // {
  //     if(IsPrime[i]) sosu.push_back(i);
  // }
  // vector<int> sum(sosu.size());
  vector<int> sum(M + 1);
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    map<int, int> fac = factorization(a);
    // for (int j = 0; j < sosu.size(); j++)
    // {
    //     if(a % sosu[j] == 0) sum[j]++;
    // }
    for (auto j : fac) {
      sum[j.first]++;
    }
  }

  int maxsum = 0;
  for (int i = 0; i < sum.size(); i++) {
    maxsum = max(maxsum, sum[i]);
  }

  if (maxsum <= 1)
    cout << "pairwise coprime" << endl;
  else if (maxsum <= n - 1)
    cout << "setwise coprime" << endl;
  else
    cout << "not coprime" << endl;
}

int main(int argc, char **argv) {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  Main();
  return 0;
}