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

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)

typedef pair<int, int> pii;

int maps[6001][6001];
int w, h;

bool check(int x, int y) { return x >= 0 && x < w && y >= 0 && y < h; }

int compress(vector<int> &xa, vector<int> &xb, int maxSize) {
  vector<int> cx;
  REP(i, xa.size()) {
    FOR(j, -1, 2) {
      if (xa[i] + j >= 0 && xa[i] + j < maxSize)
        cx.push_back(xa[i] + j);
      if (xb[i] + j >= 0 && xb[i] + j < maxSize)
        cx.push_back(xb[i] + j);
    }
  }
  cx.push_back(0);
  cx.push_back(maxSize - 1);

  sort(cx.begin(), cx.end());
  cx.erase(unique(cx.begin(), cx.end()), cx.end());

  REP(i, xa.size()) {
    xa[i] = find(cx.begin(), cx.end(), xa[i]) - cx.begin();
    xb[i] = find(cx.begin(), cx.end(), xb[i]) - cx.begin();
  }

  return cx.size();
}

int main() {
  while (cin >> w >> h, w || h) {
    int n;
    cin >> n;

    vector<int> x1, y1, x2, y2;
    REP(i, n) {
      int a1, b1, a2, b2;
      scanf("%d %d %d %d", &a1, &b1, &a2, &b2);
      x1.push_back(a1);
      y1.push_back(b1);
      x2.push_back(a2);
      y2.push_back(b2);
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    fill(maps[0], maps[h], 0);

    REP(i, n) {
      maps[y1[i]][x1[i]]++;
      maps[y2[i]][x1[i]]--;
      maps[y1[i]][x2[i]]--;
      maps[y2[i]][x2[i]]++;
    }

    REP(i, h) FOR(j, 1, w) maps[i][j] += maps[i][j - 1];
    REP(i, w) FOR(j, 1, h) maps[j][i] += maps[j - 1][i];

    int ans = 0;
    queue<pii> que;
    REP(i, h) REP(j, w) if (maps[i][j] == 0) {
      ans++;
      que.push(pii(j, i));
      while (!que.empty()) {
        pii now = que.front();
        que.pop();
        int x = now.first, y = now.second;

        if (!check(x, y) || maps[y][x] > 0)
          continue;
        maps[y][x] = 1;

        int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
        REP(k, 4) que.push(pii(x + dx[k], y + dy[k]));
      }
    }
    cout << ans << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)

typedef pair<int, int> pii;

int maps[1001][1001];
int w, h;

bool check(int x, int y) { return x >= 0 && x < w && y >= 0 && y < h; }

int compress(vector<int> &xa, vector<int> &xb, int maxSize) {
  vector<int> cx;
  REP(i, xa.size()) {
    FOR(j, -1, 2) {
      if (xa[i] + j >= 0 && xa[i] + j < maxSize)
        cx.push_back(xa[i] + j);
      if (xb[i] + j >= 0 && xb[i] + j < maxSize)
        cx.push_back(xb[i] + j);
    }
  }
  cx.push_back(0);
  cx.push_back(maxSize - 1);

  sort(cx.begin(), cx.end());
  cx.erase(unique(cx.begin(), cx.end()), cx.end());

  REP(i, xa.size()) {
    xa[i] = find(cx.begin(), cx.end(), xa[i]) - cx.begin();
    xb[i] = find(cx.begin(), cx.end(), xb[i]) - cx.begin();
  }

  return cx.size();
}

int main() {
  while (cin >> w >> h, w || h) {
    int n;
    cin >> n;

    vector<int> x1, y1, x2, y2;
    REP(i, n) {
      int a1, b1, a2, b2;
      scanf("%d %d %d %d", &a1, &b1, &a2, &b2);
      x1.push_back(a1);
      y1.push_back(b1);
      x2.push_back(a2);
      y2.push_back(b2);
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    fill(maps[0], maps[h], 0);

    REP(i, n) {
      maps[y1[i]][x1[i]]++;
      maps[y2[i]][x1[i]]--;
      maps[y1[i]][x2[i]]--;
      maps[y2[i]][x2[i]]++;
    }

    REP(i, h) FOR(j, 1, w) maps[i][j] += maps[i][j - 1];
    REP(i, w) FOR(j, 1, h) maps[j][i] += maps[j - 1][i];

    int ans = 0;
    queue<pii> que;
    REP(i, h) REP(j, w) if (maps[i][j] == 0) {
      ans++;
      que.push(pii(j, i));
      while (!que.empty()) {
        pii now = que.front();
        que.pop();
        int x = now.first, y = now.second;

        if (!check(x, y) || maps[y][x] == 1)
          continue;
        maps[y][x] = 1;

        int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
        REP(k, 4) que.push(pii(x + dx[k], y + dy[k]));
      }
    }
    cout << ans << endl;
  }
  return 0;
}