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

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < ll(n); ++i)
typedef int64_t lint;
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
using lb = long double;
// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SI(x) ((ll)(x).size())        // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
#define debug(x) cerr << #x << ": " << x << "\\n" // 手動デバッグ
#define debugV(x)                                                              \\
  for (int i = 0; i < ((ll)(x).size()); i++)                                   \\
  cerr << #x << "at:" << i << ": " << x[i] << "\\n" // 手動デバッグ
#define YES(c) cout << ((c) ? "YES\\n" : "NO\\n"), 0
#define Yes(c) cout << ((c) ? "Yes\\n" : "No\\n"), 0
#define O(p) cout << p << "\\n", 0
#define OS(p) cout << p << " ", 0
#define ON(p) cout << p, 0
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define inf 2147483647    // int値の最大値
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
#define endl "\\n"   // endlを置き換える
// 略記
#define PB emplace_back                         // vectorヘの挿入
#define MP make_pair                            // pairのコンストラクタ
#define F first                                 // pairの一つ目の要素
#define S second                                // pairの二つ目の要素
#define CST(x) cout << fixed << setprecision(x) // 小数点以下の桁数指定

const int dy[4] = {1, 0, -1, 0};
const int dx[4] = {0, 1, 0, -1}; //^>v<

template <class T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
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 gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
int lcm(int a, int b) { return a * b / gcd(a, b); }
int two(int n) {
  ll ans = 1;
  rep(i, n) { ans *= 2; }
  return ans;
}
//------------------------------------------------------------
/*
ll highest(ll n,vector<ll> A,vector<ll> &memo,vector<ll> H){
    ll ans=H[n];
    vector<ll> que(0);
    que.PB(n);
    memo[n]=1;
    while(A[n]!=-1){
        if(memo[A[n]]!=-1)break;
        que.PB(A[n]);
        memo[A[n]]=1;
        ans=max(ans,H[A[n]]);
        n=A[n];
    }
    ll sum=0;
    rep(i,que.size()){
        if(ans==H[que[i]]){
            sum++;
        }
    }
    return sum;
}*/

//------------------------------------------------------------
int main() {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  //------------------------------------------------------------
  int n, m;
  cin >> n >> m;
  vector<ll> H(n);
  vector<set<ll>> A(n);
  // vector<ll> memo(n,-1);
  rep(i, n) { cin >> H[i]; }
  rep(i, m) {
    ll a, b;
    cin >> a >> b;
    A[a - 1].insert(b - 1);
    A[b - 1].insert(a - 1);
  }
  ll ans = 0;
  rep(i, n) {

    // if(A[i].size()!=0){
    bool highest = 1;
    for (ll j : A[i]) {
      if (H[i] <= H[j]) {
        highest = 0;
        break;
      }
    }
    if (highest)
      ans++;
    //}
  }
  O(ans);

  //------------------------------------------------------------
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
int check(int num, vector<int64_t> H, vector<set<int>> T) {
  if (T.at(num).size() == 0) {
    return 0;
  }
  int64_t max_res = H.at(num);
  for (int i : T.at(num)) {
    T.at(i).erase(num);
    int64_t res = check(i, H, T);
    max_res = max(max_res, res);
  }
  return max_res;
}
int main() {
  int n, m, ans;
  cin >> n >> m;
  vector<int64_t> H(n);
  vector<set<int>> T(n);
  for (int i = 0; i < n; i++) {
    cin >> H.at(i);
  }
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    T.at(a - 1).insert(b - 1);
    T.at(b - 1).insert(a - 1);
  }
  ans = 0;
  for (int i = 0; i < n; i++) {
    if (T.at(i).size() == 0) {
      ans++;

    } else if (H.at(i) == check(i, H, T)) {
      ans++;
    }
  }
  cout << ans << endl;
}