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

#include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(n) n.begin(), n.end()
struct P {
  int x, y;
  P(int a, int b) { x = a, y = b; }
};

int compress(vector<int> &org, int length, vector<int> &one, vector<int> &two) {
  sort(all(org));
  org.erase(unique(all(org)), org.end());
  int cur = 0;
  for (
      int i = (org[0] == 0 ? 1 : 0); i < org.size();
      i++) { // org[0]ª0¾Á½çíé(»êÍ±Üé)B
    if (org[i] == cur + 1)
      cur += 1; // ×ÚµÄ½ç1Â¾¯¸ç·B
    else
      cur +=
          2; // ×ÚµÄÈ¢ñ¾Á½ç2Â(1ÂÔªó­æ¤Éæéæ)
    rep(j, one.size()) {
      if (one[j] == org[i])
        one[j] = cur;
      if (two[j] == org[i])
        two[j] = cur;
    }
  }
  return cur + (org.back() != length); // org.back() !-
                                       // length¾Á½êóÔÉÜ¾]Tª éÌÅTCYÍlength
                                       // = cur+1Æ·éB
}

bool board[3000][3000];
void dfs(bool Map[3000][3000], P start, int W, int H) {
  static const int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};

  stack<P> S;
  S.push(start);
  while (S.size()) {
    P s = S.top();
    S.pop();
    rep(i, 4) {
      P t = P(s.x + dx[i], s.y + dy[i]);
      if (t.y >= 0 && t.x >= 0 && t.y < H && t.x < W && Map[t.y][t.x] == 0) {
        Map[t.y][t.x] = true;
        S.push(t);
      }
    }
  }
}

int main() {
  int W, H;
  while (cin >> W >> H, W) {
    vector<int> ox, oy, sx, ex, sy, ey;
    int n;
    cin >> n;
    rep(i, n) {
      int x1, y1, x2, y2;
      cin >> x1 >> y1 >> x2 >> y2;
      sx.push_back(x1),
          sy.push_back(y1); // s? = ¶º (ÀW³k³êéû1)
      ex.push_back(x2),
          ey.push_back(y2); // e? = Eã (ÀW³k³êéû2)

      ox.push_back(x1),
          oy.push_back(
              y1); // o? =
                   // s?àe?àÇÁ¿àÂÁ±ÞB(ÀW³kÌÚóÉg¤)
      ox.push_back(x2), oy.push_back(y2); //
    }
    // ³k
    // compress(...)ÌÔèlÍ³kãÌÕÊTCYB
    W = compress(ox, W, sx, ex);
    H = compress(oy, H, sy, ey);

    rep(i, H) rep(j, W) board[i][j] = false; // ú»

    // ³kãÌ¶ºÆEãÀWðgÁÄÕÊðhèÂÔ·B
    rep(i, n) {
      for (int x = sx[i]; x < ex[i]; x++) {
        for (int y = sy[i]; y < ey[i]; y++) {
          board[y][x] = true;
        }
      }
    }
    // hèÂÔµÈªç¦é´¶BÀÛÉhèÂÔ·ÌÍdfs()ÖB
    int ans = 0;
    rep(y, H) {
      rep(x, W) {
        if (board[y][x] == false) {
          ans++;
          dfs(board, P(x, y), W, H);
        }
      }
    }

    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

#include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(n) n.begin(), n.end()
struct P {
  int x, y;
  P(int a, int b) { x = a, y = b; }
};

int compress(vector<int> &org, int length, vector<int> &one, vector<int> &two) {
  sort(all(org));
  org.erase(unique(all(org)), org.end());
  int cur = 0;
  for (
      int i = (org[0] == 0 ? 1 : 0); i < org.size();
      i++) { // org[0]ª0¾Á½çíé(»êÍ±Üé)B
    if (org[i] == cur + 1)
      cur += 1; // ×ÚµÄ½ç1Â¾¯¸ç·B
    else
      cur +=
          2; // ×ÚµÄÈ¢ñ¾Á½ç2Â(1ÂÔªó­æ¤Éæéæ)
    rep(j, one.size()) {
      if (one[j] == org[i])
        one[j] = cur;
      if (two[j] == org[i])
        two[j] = cur;
    }
  }
  return cur + (org.back() != length); // org.back() !-
                                       // length¾Á½êóÔÉÜ¾]Tª éÌÅTCYÍlength
                                       // = cur+1Æ·éB
}

void dfs(bool Map[1000][1000], P start, int W, int H) {
  static const int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};

  stack<P> S;
  S.push(start);
  while (S.size()) {
    P s = S.top();
    S.pop();
    rep(i, 4) {
      P t = P(s.x + dx[i], s.y + dy[i]);
      if (t.y >= 0 && t.x >= 0 && t.y < H && t.x < W && Map[t.y][t.x] == 0) {
        Map[t.y][t.x] = true;
        S.push(t);
      }
    }
  }
}

int main() {
  int W, H;
  while (cin >> W >> H, W) {
    vector<int> ox, oy, sx, ex, sy, ey;
    int n;
    cin >> n;
    rep(i, n) {
      int x1, y1, x2, y2;
      cin >> x1 >> y1 >> x2 >> y2;
      sx.push_back(x1),
          sy.push_back(y1); // s? = ¶º (ÀW³k³êéû1)
      ex.push_back(x2),
          ey.push_back(y2); // e? = Eã (ÀW³k³êéû2)

      ox.push_back(x1),
          oy.push_back(
              y1); // o? =
                   // s?àe?àÇÁ¿àÂÁ±ÞB(ÀW³kÌÚóÉg¤)
      ox.push_back(x2), oy.push_back(y2); //
    }
    // ³k
    // compress(...)ÌÔèlÍ³kãÌÕÊTCYB
    W = compress(ox, W, sx, ex);
    H = compress(oy, H, sy, ey);

    bool after[1000][1000] = {{false}};

    // ³kãÌ¶ºÆEãÀWðgÁÄÕÊðhèÂÔ·B
    rep(i, n) {
      for (int x = sx[i]; x < ex[i]; x++) {
        for (int y = sy[i]; y < ey[i]; y++) {
          after[y][x] = true;
        }
      }
    }
    // hèÂÔµÈªç¦é´¶BÀÛÉhèÂÔ·ÌÍdfs()ÖB
    int ans = 0;
    rep(y, H) {
      rep(x, W) {
        if (after[y][x] == false) {
          ans++;
          dfs(after, P(x, y), W, H);
        }
      }
    }

    cout << ans << endl;
  }
}