Problem p02799 (C++)

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

#define FAST                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second
#define cbr cerr << "hi\n"
#define mmst(x, v) memset((x), v, sizeof((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) (lower_bound(all(x), y) - x.begin())
#define ubd(x, y) (upper_bound(all(x), y) - x.begin())
mt19937
    rng(chrono::steady_clock::now()
            .time_since_epoch()
            .count()); // can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) {
  return rng() % (y + 1 - x) + x;
} // inclusivesss
string inline to_string(char c) {
  string s(1, c);
  return s;
}
template <typename T> inline T gcd(T a, T b) {
  return a == 0 ? llabs(b) : gcd(b % a, a);
}

using ll = long long;
using ld = long double;
#define FOR(i, s, e) for (ll i = s; i <= ll(e); ++i)
#define DEC(i, s, e) for (ll i = s; i >= ll(e); --i)
using pi = pair<ll, ll>;
using spi = pair<ll, pi>;
using dpi = pair<pi, pi>;

#define LLINF ((long long)1e18)
#define INF int(1e9 + 1e6)
#define MAXN (100006)
ll n, m, A[MAXN], colour[MAXN], cost[MAXN];
bitset<MAXN> vis;
vector<pi> v[MAXN];
int main() {
  FAST cin >> n >> m;
  FOR(i, 1, n) cin >> A[i];
  FOR(i, 1, m) {
    ll a, b;
    cin >> a >> b;
    v[a].eb(b, i), v[b].eb(a, i);
  }
  FOR(i, 1, n) {
    ll mi = LLINF;
    for (auto j : v[i])
      mi = min(mi, A[j.f]);
    if (mi > A[i]) {
      cout << "-1\n";
      return 0;
    }
  }
  vector<pi> D;
  FOR(i, 1, n) D.eb(A[i], i);
  sort(all(D), greater<>());
  int co = 0;
  while (D.size()) {
    ll deal = D.back().f;
    vector<int> cur;
    cur.eb(D.back().s), D.pop_back();
    while (D.size() && D.back().f == deal)
      cur.eb(D.back().s), D.pop_back();
    function<void(ll)> dfs = [&](ll x) {
      if (vis[x])
        return;
      vis[x] = 1;
      for (auto i : v[x])
        if (cost[i.s] == 0) {
          if (colour[i.f]) {
            assert(vis[i.f]);
            if (colour[i.f] == colour[x])
              cost[i.s] = max(1ll, A[x] - A[i.f]);
            else
              cost[i.s] = A[x];
          } else if (A[i.f] == deal) {
            assert(!vis[i.f]); // since colour==0
            colour[i.f] = 3 - colour[x];
            cost[i.s] = A[x];
            dfs(i.f);
          }
        }
    };
    for (auto &i : cur)
      if (!vis[i])
        colour[i] = (co & 1) + 1, dfs(i);
    ++co;
  }
  FOR(i, 1, n) if (colour[i] == 1) cout << 'W';
  else cout << 'B';
  cout << '\n';
  FOR(i, 1, m) cout << cost[i] << '\n';
}


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

#define FAST                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second
#define cbr cerr << "hi\n"
#define mmst(x, v) memset((x), v, sizeof((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) (lower_bound(all(x), y) - x.begin())
#define ubd(x, y) (upper_bound(all(x), y) - x.begin())
mt19937
    rng(chrono::steady_clock::now()
            .time_since_epoch()
            .count()); // can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) {
  return rng() % (y + 1 - x) + x;
} // inclusivesss
string inline to_string(char c) {
  string s(1, c);
  return s;
}
template <typename T> inline T gcd(T a, T b) {
  return a == 0 ? llabs(b) : gcd(b % a, a);
}

using ll = long long;
using ld = long double;
#define FOR(i, s, e) for (ll i = s; i <= ll(e); ++i)
#define DEC(i, s, e) for (ll i = s; i >= ll(e); --i)
using pi = pair<ll, ll>;
using spi = pair<ll, pi>;
using dpi = pair<pi, pi>;

#define LLINF ((long long)1e18)
#define INF int(1e9 + 1e6)
#define MAXN (100006)
ll n, m, A[MAXN], colour[MAXN], cost[MAXN * 2];
bitset<MAXN> vis;
vector<pi> v[MAXN];
int main() {
  FAST cin >> n >> m;
  FOR(i, 1, n) cin >> A[i];
  FOR(i, 1, m) {
    ll a, b;
    cin >> a >> b;
    v[a].eb(b, i), v[b].eb(a, i);
  }
  FOR(i, 1, n) {
    ll mi = LLINF;
    for (auto j : v[i])
      mi = min(mi, A[j.f]);
    if (mi > A[i]) {
      cout << "-1\n";
      return 0;
    }
  }
  vector<pi> D;
  FOR(i, 1, n) D.eb(A[i], i);
  sort(all(D), greater<>());
  int co = 0;
  while (D.size()) {
    ll deal = D.back().f;
    vector<int> cur;
    cur.eb(D.back().s), D.pop_back();
    while (D.size() && D.back().f == deal)
      cur.eb(D.back().s), D.pop_back();
    function<void(ll)> dfs = [&](ll x) {
      if (vis[x])
        return;
      vis[x] = 1;
      for (auto i : v[x])
        if (cost[i.s] == 0) {
          if (colour[i.f]) {
            assert(vis[i.f]);
            if (colour[i.f] == colour[x])
              cost[i.s] = max(1ll, A[x] - A[i.f]);
            else
              cost[i.s] = A[x];
          } else if (A[i.f] == deal) {
            assert(!vis[i.f]); // since colour==0
            colour[i.f] = 3 - colour[x];
            cost[i.s] = A[x];
            dfs(i.f);
          }
        }
    };
    for (auto &i : cur)
      if (!vis[i])
        colour[i] = (co & 1) + 1, dfs(i);
    ++co;
  }
  FOR(i, 1, n) if (colour[i] == 1) cout << 'W';
  else cout << 'B';
  cout << '\n';
  FOR(i, 1, m) cout << cost[i] << '\n';
}