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

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;

#define Y first
#define X second

const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const int MAX = 1000;

int w, h;
vector<int> x1(MAX), y1(MAX), x2(MAX), y2(MAX), lis;
vector<vector<int>> board(MAX * 2 + 2, vector<int>(MAX * 2 + 2));

void compress(int &size, vector<int> &c1, vector<int> &c2) {
  lis.clear();
  lis.reserve(c1.size() * 2 + 2);

  lis.push_back(0);
  lis.push_back(size);

  for (int i = 0; i < c1.size(); ++i) {
    lis.push_back(c1[i]);
    lis.push_back(c2[i]);
  }

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

  for (int i = 0; i < c1.size(); ++i) {
    c1[i] = lower_bound(lis.begin(), lis.end(), c1[i]) - lis.begin();
    c2[i] = lower_bound(lis.begin(), lis.end(), c2[i]) - lis.begin();
  }

  size = lis.size();
}

void bfs(int y, int x) {
  queue<pair<int, int>> que;
  que.push(make_pair(y, x));
  board[y][x] = 1;

  while (!que.empty()) {
    pair<int, int> p = que.front();
    que.pop();

    for (int i = 0; i < 4; ++i) {
      int nx = p.X + dx[i];
      int ny = p.Y + dy[i];

      if (nx < 0 || nx >= w - 1 || ny < 0 || ny >= h - 1 || board[ny][nx])
        continue;

      board[ny][nx] = 1;
      que.push(make_pair(ny, nx));
    }
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

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

    for (int i = 0; i < n; ++i)
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];

    compress(w, x1, x2);
    compress(h, y1, y2);

    for (int i = 0; i < h; ++i)
      fill(board[i].begin(), board[i].end(), 0);

    for (int i = 0; i < n; ++i) {
      board[y1[i]][x1[i]] += 1;
      board[y1[i]][x2[i]] -= 1;
      board[y2[i]][x1[i]] -= 1;
      board[y2[i]][x2[i]] += 1;
    }

    for (int i = 0; i < h; ++i)
      for (int j = 0; j < w - 1; ++j)
        board[i][j + 1] += board[i][j];

    for (int j = 0; j < w; ++j)
      for (int i = 0; i < h - 1; ++i)
        board[i + 1][j] += board[i][j];

    for (int i = 0; i < h; ++i)
      board[i][w - 1] = 1;

    for (int i = 0; i < w; ++i)
      board[h - 1][i] = 1;

    int ans = 0;
    for (int i = 0; i < h; ++i) {
      for (int j = 0; j < w; ++j) {
        if (!board[i][j]) {
          ++ans;
          bfs(i, j);
        }
      }
    }

    cout << ans << endl;
  }

  return EXIT_SUCCESS;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;

#define Y first
#define X second

const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const int MAX = 1000;

int w, h;
vector<int> x1(MAX), y1(MAX), x2(MAX), y2(MAX), lis;
vector<vector<int>> board(MAX * 2 + 2, vector<int>(MAX * 2 + 2));

void compress(int &size, vector<int> &c1, vector<int> &c2) {
  lis.clear();
  lis.reserve(c1.size() * 2 + 2);

  lis.push_back(0);
  lis.push_back(size);

  for (int i = 0; i < c1.size(); ++i) {
    lis.push_back(c1[i]);
    lis.push_back(c2[i]);
  }

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

  for (int i = 0; i < c1.size(); ++i) {
    c1[i] = lower_bound(lis.begin(), lis.end(), c1[i]) - lis.begin();
    c2[i] = lower_bound(lis.begin(), lis.end(), c2[i]) - lis.begin();
  }

  size = lis.size();
}

void bfs(int y, int x) {
  queue<pair<int, int>> que;
  que.push(make_pair(y, x));

  while (!que.empty()) {
    pair<int, int> p = que.front();
    que.pop();

    board[p.Y][p.X] = 1;

    for (int i = 0; i < 4; ++i) {
      int nx = p.X + dx[i];
      int ny = p.Y + dy[i];

      if (nx < 0 || nx >= w || ny < 0 || ny >= h)
        continue;

      if (!board[ny][nx])
        que.push(make_pair(ny, nx));
    }
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

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

    for (int i = 0; i < n; ++i)
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];

    compress(w, x1, x2);
    compress(h, y1, y2);

    for (int i = 0; i < h; ++i)
      fill(board[i].begin(), board[i].end(), 0);

    for (int i = 0; i < n; ++i) {
      board[y1[i]][x1[i]] += 1;
      board[y1[i]][x2[i]] -= 1;
      board[y2[i]][x1[i]] -= 1;
      board[y2[i]][x2[i]] += 1;
    }

    for (int i = 0; i < h; ++i)
      for (int j = 0; j < w - 1; ++j)
        board[i][j + 1] += board[i][j];

    for (int j = 0; j < w; ++j)
      for (int i = 0; i < h - 1; ++i)
        board[i + 1][j] += board[i][j];

    for (int i = 0; i < h; ++i)
      board[i][w - 1] = 1;

    for (int i = 0; i < w; ++i)
      board[h - 1][i] = 1;

    int ans = 0;
    for (int i = 0; i < h; ++i) {
      for (int j = 0; j < w; ++j) {
        if (!board[i][j]) {
          ++ans;
          bfs(i, j);
        }
      }
    }

    cout << ans << endl;
  }

  return EXIT_SUCCESS;
}