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

#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <cmath>
#include <cstdint> // int64_t, int*_t
#include <cstdio>  // printf
#include <cstring>
#include <deque> // deque
#include <float.h>
#include <iostream> // cout, endl, cin
#include <iterator>
#include <map> // map
#include <math.h>
#include <numeric>
#include <queue> // queue, priority_queue
#include <set>   // set
#include <sstream>
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
using namespace std;
using Graph = vector<vector<int>>;
// repマクロの定義
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
// allマクロの定義
#define all(v) v.begin(), v.end()
// 大きい順
#define rall(v) v.rbegin(), v.rend()
#define vi vector<int>
#define vl vector<ll>
const long long INF = 1LL << 60;
typedef long long ll;
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;
}

int ctoi(char c) {
  switch (c) {
  case '0':
    return 0;
  case '1':
    return 1;
  case '2':
    return 2;
  case '3':
    return 3;
  case '4':
    return 4;
  case '5':
    return 5;
  case '6':
    return 6;
  case '7':
    return 7;
  case '8':
    return 8;
  case '9':
    return 9;
  default:
    return 0;
  }
}

bool is_prime(const unsigned n) {
  switch (n) {
  case 0: // fall-through
  case 1:
    return false;
  case 2: // fall-through
  case 3:
    return true;
  } // n > 3 が保証された

  if (n % 2 == 0 || n % 3 == 0)
    return false;
  // n は 2 と 3 のいずれの倍数でもないことが保証された
  // これより n は (6の倍数)-1 か (6の倍数)+1 である

  // 6の倍数前後の数を使って試し割りをする
  for (unsigned i = 5; i * i <= n; i += 6) {
    if (n % i == 0)
      return false; // (6の倍数)-1
    if (n % (i + 2) == 0)
      return false; // (6の倍数)+1
  }

  return true;
}

map<int, int> mp;

int primeFactorization(int a) { // 素因数分解を出力するプログラム
  int i, sq;
  if (a % 2 == 0) { // 偶数の場合
    if (!mp.count(2)) {
      mp[2] = 1;
    } else {
      mp[2] += 1;
    }
    return primeFactorization(a / 2); // 2で割った値で再帰
  }
  sq = sqrt(a);
  for (i = 3; i <= sq; i += 2) { // 3以上√a以下の奇数の場合
    if (a % i == 0) {
      if (!mp.count(i)) {
        mp[i] = 1;
      } else {
        mp[i] += 1;
      }
      return primeFactorization(a / i); // 割れた値で再帰
    }
  }
  // 偶数でも3以上√a以下の奇数の場合でも割り切れない場合
  if (a != 1) { // aが1でないなら、a自身は素数
    if (!mp.count(a))
      mp[a] = 1;
    else {
      mp[a] += 1;
    }
  }
  return 0;
}

ll kaizyou(ll n) {
  if (n == 1) {
    return 1;
  } else {
    return (n * kaizyou(n - 1)) % 1000000007;
  }
}

int main() {
  int N, M;
  cin >> N >> M;
  vi H(N);
  rep(i, N) cin >> H[i];
  vector<bool> X(N, true);
  rep(i, M) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    if (H[a] > H[b])
      X[b] = false;
    else if (H[b] > H[a])
      X[a] = false;
    else
      X[a] = X[b] = false;
  }
  int cnt = 0;
  rep(i, N) {
    if (X[i] == true)
      cnt++;
  }
  cout << cnt << endl;
}

Error: 0

Fixed submission:

#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <cmath>
#include <cstdint> // int64_t, int*_t
#include <cstdio>  // printf
#include <cstring>
#include <deque>    // deque
#include <iostream> // cout, endl, cin
#include <map>      // map
#include <numeric>
#include <queue>         // queue, priority_queue
#include <set>           // set
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef unsigned long long ll;

int main() {
  ll N, M;
  cin >> N >> M;
  vector<ll> H(N);
  for (ll i = 0; i < M; i++)
    cin >> H[i];
  set<ll> S;
  set<ll> K;

  vector<pair<ll, ll>> p(M);
  for (ll i = 0; i < M; i++) {
    ll a, b;

    cin >> a >> b;
    K.insert(a);
    K.insert(b);
    p.at(i) = make_pair(a, b);
  }
  sort(p.begin(), p.end());
  for (ll i = 0; i < M; i++) {
    if (H[p[i].first - 1] > H[p[i].second - 1]) {
      S.insert(H[p[i].first - 1]);
    } else if ((H[p[i].first - 1] < H[p[i].second - 1])) {
      S.insert(H[p[i].second - 1]);
    }
  }
  cout << N - K.size() + S.size() << endl;
}