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

#include "bits/stdc++.h"

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
void sort2array(double *a, long *b, long n) {
  for (int i = 0; i < n; i++) {
    b[i] = i;
  }
  sort(b, b + n, [a](long i, long j) -> bool { return a[i] < a[j]; });
}
// bを何回足せばaを超えるか
int wtover(int a, int b) {
  if (a % b > 0)
    return (a / b) + 1;
  else
    return a / b;
}
const int INF = 100000001, ID_MAX = 20;
int bi_e[ID_MAX] = {0};
// 2進数表示したときの最高桁
int bi_max(long n) {
  int m = 0;
  for (m; pow(2, m) <= n; m++)
    ;
  m = m - 1;
  return m;
}
// bi_eに二進数表示したやつを代入
void bi_exs(long n) {
  rep(i, ID_MAX) { bi_e[i] = 0; }
  if (n < pow(2, ID_MAX)) {
    int m = bi_max(n);
    long l;
    for (m; m > -1; m--) {
      l = pow(2, m);
      bi_e[m] = n / l;
      n = n % l;
    }
  }
}
// x^n mod m (nが負の時は０)
long myPow(long x, long n, long m) {
  if (n < 0)
    return 0;
  if (n == 0)
    return 1;
  if (n % 2 == 0)
    return myPow(x * x % m, n / 2, m);
  else
    return x * myPow(x, n - 1, m) % m;
}
const int N_MAX = (1e5) + 1;
long int n, a[3], s[N_MAX];
string tem[3] = {"AB", "AC", "BC"};
pair<int, int> ch[3] = {pair<int, int>(0, 1), pair<int, int>(0, 2),
                        pair<int, int>(1, 2)};
char res[N_MAX];
char key[3] = {'A', 'B', 'C'};

int main() {
  long int i = 0;
  string x;
  // 入力
  cin >> n >> a[0] >> a[1] >> a[2];
  rep(i, n) {
    cin >> x;
    rep(j, 3) {
      if (tem[j] == x) {
        s[i] = j;
        break;
      }
    }
  }
  // 処理
  i = 0;
  long sum = a[0] + a[1] + a[2];
  if (sum == 0) {
    cout << "No" << endl;
    return 0;
  } else {
    while (i < n && a[ch[s[i]].first] + a[ch[s[i]].second] > 0) {
      if (i < n - 1 && a[ch[s[i]].first] == 1 && a[ch[s[i]].second] == 1) {
        if (ch[s[i + 1]].first == ch[s[i]].first ||
            ch[s[i + 1]].second == ch[s[i]].first) {
          a[ch[s[i]].first]++;
          a[ch[s[i]].second]--;
          res[i] = key[ch[s[i]].first];
        } else {
          a[ch[s[i]].first]--;
          a[ch[s[i]].second]++;
          res[i] = key[ch[s[i]].second];
        }
      } else {
        if (a[ch[s[i]].first] >= a[ch[s[i]].second]) {
          a[ch[s[i]].first]--;
          a[ch[s[i]].second]++;
          res[i] = key[ch[s[i]].second];
        } else {
          a[ch[s[i]].first]++;
          a[ch[s[i]].second]--;
          res[i] = key[ch[s[i]].first];
        }
      }
      i++;
    }
  }
  if (i < n) {
    cout << "No" << endl;
    return 0;
  }
  // 出力
  cout << "Yes" << endl;
  rep(i, n) { cout << res[i] << endl; }
}

Error: 0

Fixed submission:

#include "bits/stdc++.h"

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
void sort2array(double *a, long *b, long n) {
  for (int i = 0; i < n; i++) {
    b[i] = i;
  }
  sort(b, b + n, [a](long i, long j) -> bool { return a[i] < a[j]; });
}
// bを何回足せばaを超えるか
int wtover(int a, int b) {
  if (a % b > 0)
    return (a / b) + 1;
  else
    return a / b;
}
const int INF = 100000001, ID_MAX = 20;
int bi_e[ID_MAX] = {0};
// 2進数表示したときの最高桁
int bi_max(long n) {
  int m = 0;
  for (m; pow(2, m) <= n; m++)
    ;
  m = m - 1;
  return m;
}
// bi_eに二進数表示したやつを代入
void bi_exs(long n) {
  rep(i, ID_MAX) { bi_e[i] = 0; }
  if (n < pow(2, ID_MAX)) {
    int m = bi_max(n);
    long l;
    for (m; m > -1; m--) {
      l = pow(2, m);
      bi_e[m] = n / l;
      n = n % l;
    }
  }
}
// x^n mod m (nが負の時は０)
long myPow(long x, long n, long m) {
  if (n < 0)
    return 0;
  if (n == 0)
    return 1;
  if (n % 2 == 0)
    return myPow(x * x % m, n / 2, m);
  else
    return x * myPow(x, n - 1, m) % m;
}
const int N_MAX = (1e5) + 1;
long int n, a[3], s[N_MAX];
string tem[3] = {"AB", "AC", "BC"};
pair<int, int> ch[3] = {pair<int, int>(0, 1), pair<int, int>(0, 2),
                        pair<int, int>(1, 2)};
char res[N_MAX];
char key[3] = {'A', 'B', 'C'};

int main() {
  long int i = 0;
  string x;
  // 入力
  cin >> n >> a[0] >> a[1] >> a[2];
  rep(i, n) {
    cin >> x;
    rep(j, 3) {
      if (tem[j] == x) {
        s[i] = j;
        break;
      }
    }
  }
  // 処理
  i = 0;
  long sum = a[0] + a[1] + a[2];
  if (sum == 0) {
    cout << "No" << endl;
    return 1;
  } else {
    while (i < n && a[ch[s[i]].first] + a[ch[s[i]].second] > 0) {
      if (i < n - 1 && a[ch[s[i]].first] == 1 && a[ch[s[i]].second] == 1) {
        if (ch[s[i + 1]].first == ch[s[i]].first ||
            ch[s[i + 1]].second == ch[s[i + 1]].first) {
          a[ch[s[i]].first]++;
          a[ch[s[i]].second]--;
          res[i] = key[ch[s[i]].first];
        } else {
          a[ch[s[i]].first]--;
          a[ch[s[i]].second]++;
          res[i] = key[ch[s[i]].second];
        }
      } else {
        if (a[ch[s[i]].first] >= a[ch[s[i]].second]) {
          a[ch[s[i]].first]--;
          a[ch[s[i]].second]++;
          res[i] = key[ch[s[i]].second];
        } else {
          a[ch[s[i]].first]++;
          a[ch[s[i]].second]--;
          res[i] = key[ch[s[i]].first];
        }
      }
      i++;
    }
  }
  if (i < n) {
    cout << "No" << endl;
    return 1;
  }
  // 出力
  cout << "Yes" << endl;
  rep(i, n) { cout << res[i] << endl; }
}