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

#include <algorithm>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>

#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define all(c) (c).begin(), (c).end()
#define mp make_pair
#define pb push_back
#define each(i, c)                                                             \\
  for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define dbg(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

const int dy[] = {-1, 0, 1, 0}, dx[] = {0, -1, 0, 1};
int n, dp[40000], st[40000], k;
map<pi, int> id;
vi x, y, d;

bool rec(int cx, int cy, int cd) {
  queue<pair<pi, int>> q;
  q.push(mp(mp(cx, cy), cd));
  dp[st[k++] = id[mp(cx, cy)]] = cd;

  while (!q.empty()) {
    cx = q.front().first.first;
    cy = q.front().first.second;
    cd = q.front().second;
    q.pop();

    rep(d, 4) {
      int nx = cx + dx[d], ny = cy + dy[d];
      if (!id.count(mp(nx, ny)))
        continue;
      int ii = id[mp(nx, ny)];
      int nd = ii == (id[mp(cx, cy)] ^ 1) ? 1 - cd : cd;

      if (dp[ii] >= 0 && dp[ii] != nd)
        return 0;
      if (dp[ii] >= 0)
        continue;
      dp[st[k++] = ii] = nd;
      q.push(mp(mp(nx, ny), nd));
    }
  }
  return 1;
}

int main() {
  while (scanf("%d", &n), n) {
    x.clear();
    y.clear();
    d.clear();
    id.clear();

    rep(i, n) {
      int a, b;
      char c;
      scanf("%d%d %c", &a, &b, &c);
      x.pb(a);
      y.pb(b);
      d.pb(c == 'x');
      id[mp(a, b)] = i * 2;
      id[mp(a + d[i], b + 1 - d[i])] = i * 2 + 1;
    }
    memset(dp, -1, sizeof(dp));
    rep(i, 2 * n) if (dp[i] < 0) {
      k = 0;
      if (rec(x[i / 2], y[i / 2], 0))
        continue;
      while (k)
        dp[st[--k]] = -1;
      if (!rec(x[i / 2], y[i / 2], 1)) {
        cout << "No" << endl;
        goto END;
      }
    }
    cout << "Yes" << endl;
  END:;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>

#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define all(c) (c).begin(), (c).end()
#define mp make_pair
#define pb push_back
#define each(i, c)                                                             \\
  for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define dbg(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

const int dy[] = {-1, 0, 1, 0}, dx[] = {0, -1, 0, 1};
int n, dp[400000], st[400000], k;
map<pi, int> id;
vi x, y, d;

bool rec(int cx, int cy, int cd) {
  queue<pair<pi, int>> q;
  q.push(mp(mp(cx, cy), cd));
  dp[st[k++] = id[mp(cx, cy)]] = cd;

  while (!q.empty()) {
    cx = q.front().first.first;
    cy = q.front().first.second;
    cd = q.front().second;
    q.pop();

    rep(d, 4) {
      int nx = cx + dx[d], ny = cy + dy[d];
      if (!id.count(mp(nx, ny)))
        continue;
      int ii = id[mp(nx, ny)];
      int nd = ii == (id[mp(cx, cy)] ^ 1) ? 1 - cd : cd;

      if (dp[ii] >= 0 && dp[ii] != nd)
        return 0;
      if (dp[ii] >= 0)
        continue;
      dp[st[k++] = ii] = nd;
      while (k >= 400000)
        ;
      q.push(mp(mp(nx, ny), nd));
    }
  }
  return 1;
}

int main() {
  while (scanf("%d", &n), n) {
    x.clear();
    y.clear();
    d.clear();
    id.clear();

    rep(i, n) {
      int a, b;
      char c;
      scanf("%d%d %c", &a, &b, &c);
      x.pb(a);
      y.pb(b);
      d.pb(c == 'x');
      id[mp(a, b)] = i * 2;
      id[mp(a + d[i], b + 1 - d[i])] = i * 2 + 1;
    }
    memset(dp, -1, sizeof(dp));
    rep(i, 2 * n) if (dp[i] < 0) {
      k = 0;
      if (rec(x[i], y[i], 0))
        continue;
      while (k)
        dp[st[--k]] = -1;
      if (!rec(x[i], y[i], 1)) {
        cout << "No" << endl;
        goto END;
      }
    }
    cout << "Yes" << endl;
  END:;
  }
  return 0;
}