Problem p00454 (C++)

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

#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, s, n) for (int i = s; i < n; i++)
#define GRGR(dx, dy)                                                           \
  for (int i = 0, dir[6] = {0, -1, 0, 1, 0, 0}, dx, dy;                        \
       dx = dir[i], dy = dir[i + 1], i < 4; i++)
typedef pair<int, int> P;
struct T {
  int x1, y1, x2, y2;
};
int w, h, n;
int vw, vh;
set<int> vx;
set<int> vy;
T t[1002];
bool bd[3000][3000];

void debug() {
  REP(j, vh) {
    REP(i, vw) cout << bd[i][j] << " ";
    cout << endl;
  }
}

int r2v(set<int> vs, int r) { return distance(vs.begin(), vs.find(r)); }

void paint(int i, int j) {
  queue<P> que;
  que.push(P(i, j));
  bd[i][j] = 0;
  while (!que.empty()) {
    P p = que.front();
    que.pop();
    int px = p.first, py = p.second;
    GRGR(dx, dy) {
      if (px < 0 || vw <= px || py < 0 || vh <= py) {
        continue;
      }
      if (bd[px + dx][py + dy]) {
        que.push(P(px + dx, py + dy));
        bd[px + dx][py + dy] = 0;
      }
    }
  }
}

int main() {
  while (cin >> w >> h, w) {
    cin >> n;
    vx.clear();
    vy.clear();
    vx.insert(0);
    vx.insert(w);
    vy.insert(0);
    vy.insert(h);
    int x1, y1, x2, y2;
    REP(i, n) {
      cin >> x1 >> y1 >> x2 >> y2;
      vx.insert(x1);
      vy.insert(y1);
      vx.insert(x2);
      vy.insert(y2);
      t[i] = {x1, y1, x2, y2};
    }
    vw = vx.size() - 1;
    vh = vy.size() - 1;
    REP(i, vw) REP(j, vh) bd[i][j] = 1;
    REP(i, n) {
      x1 = r2v(vx, t[i].x1);
      y1 = r2v(vy, t[i].y1);
      x2 = r2v(vx, t[i].x2);
      y2 = r2v(vy, t[i].y2);
      FOR(i, x1, x2) FOR(j, y1, y2) bd[i][j] = 0;
    }
    // debug();
    int ans = 0;
    REP(i, vw) REP(j, vh) {
      if (bd[i][j]) {
        paint(i, j);
        ans++;
      }
    }
    cout << ans << endl;
  }
  return 0;
}

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

#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, s, n) for (int i = s; i < n; i++)
#define GRGR(dx, dy)                                                           \
  for (int i = 0, dir[6] = {0, -1, 0, 1, 0, 0}, dx, dy;                        \
       dx = dir[i], dy = dir[i + 1], i < 4; i++)
typedef pair<int, int> P;
struct T {
  int x1, y1, x2, y2;
};
int w, h, n;
int vw, vh;
set<int> vx;
set<int> vy;
T t[1002];
bool bd[3000][3000];

void debug() {
  REP(j, vh) {
    REP(i, vw) cout << bd[i][j] << " ";
    cout << endl;
  }
}

int r2v(set<int> vs, int r) { return distance(vs.begin(), vs.find(r)); }

void paint(int i, int j) {
  queue<P> que;
  que.push(P(i, j));
  bd[i][j] = 0;
  while (!que.empty()) {
    P p = que.front();
    que.pop();
    int px = p.first, py = p.second;
    GRGR(dx, dy) {
      if (px + dx < 0 || vw <= px + dx || py + dy < 0 || vh <= py + dy) {
        continue;
      }
      if (bd[px + dx][py + dy]) {
        que.push(P(px + dx, py + dy));
        bd[px + dx][py + dy] = 0;
      }
    }
  }
}

int main() {
  while (cin >> w >> h, w) {
    cin >> n;
    vx.clear();
    vy.clear();
    vx.insert(0);
    vx.insert(w);
    vy.insert(0);
    vy.insert(h);
    int x1, y1, x2, y2;
    REP(i, n) {
      cin >> x1 >> y1 >> x2 >> y2;
      vx.insert(x1);
      vy.insert(y1);
      vx.insert(x2);
      vy.insert(y2);
      t[i] = {x1, y1, x2, y2};
    }
    vw = vx.size() - 1;
    vh = vy.size() - 1;
    REP(i, vw) REP(j, vh) bd[i][j] = 1;
    REP(i, n) {
      x1 = r2v(vx, t[i].x1);
      y1 = r2v(vy, t[i].y1);
      x2 = r2v(vx, t[i].x2);
      y2 = r2v(vy, t[i].y2);
      FOR(i, x1, x2) FOR(j, y1, y2) bd[i][j] = 0;
    }
    // debug();
    int ans = 0;
    REP(i, vw) REP(j, vh) {
      if (bd[i][j]) {
        paint(i, j);
        ans++;
      }
    }
    cout << ans << endl;
  }
  return 0;
}