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

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

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

void bfs(int y, int x, vector<vector<int>> &g) {
  queue<pii> q;
  q.push(pii(y, x));
  g[y][x] = 1;

  while (q.size()) {
    y = q.front().first;
    x = q.front().second;
    q.pop();

    for (int i = 0; i < 4; i++) {
      int ny = y + dy[i], nx = x + dx[i];
      if (ny < 0 || nx < 0 || ny >= (int)g.size() || nx >= (int)g[0].size())
        continue;
      if (g[ny][nx] == 1)
        continue;
      g[ny][nx] = 1;
      q.push(pii(ny, nx));
    }
  }
}

int main() {
  int w, h, n;
  while (cin >> w >> h) {
    if (w == 0 && h == 0)
      break;
    cin >> n;
    vector<int> cordx, cordy;
    vector<int> x1(n), y1(n), x2(n), y2(n);

    cordx.push_back(0);
    cordx.push_back(w - 1);
    cordy.push_back(0);
    cordy.push_back(h - 1);

    for (int i = 0; i < n; i++) {
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
      for (int d = -1; d <= 1; d++) {
        if (0 <= x1[i] + d && x1[i] + d < w)
          cordx.push_back(x1[i] + d);
        if (0 <= x2[i] + d && x2[i] + d < w)
          cordx.push_back(x2[i] + d);
        if (0 <= y1[i] + d && y1[i] + d < h)
          cordy.push_back(y1[i] + d);
        if (0 <= y2[i] + d && y2[i] + d < h)
          cordy.push_back(y2[i] + d);
      }
    }

    sort(cordx.begin(), cordx.end());
    cordx.erase(unique(cordx.begin(), cordx.end()), cordx.end());
    sort(cordy.begin(), cordy.end());
    cordy.erase(unique(cordy.begin(), cordy.end()), cordy.end());

    for (int i = 0; i < n; i++) {
      int val = lower_bound(cordx.begin(), cordx.end(), x1[i]) - cordx.begin();
      x1[i] = val;
      val = lower_bound(cordx.begin(), cordx.end(), x2[i]) - cordx.begin();
      x2[i] = val;
      val = lower_bound(cordy.begin(), cordy.end(), y1[i]) - cordy.begin();
      y1[i] = val;
      val = lower_bound(cordy.begin(), cordy.end(), y2[i]) - cordy.begin();
      y2[i] = val;
    }

    h = cordy.size();
    w = cordx.size();
    vector<vector<int>> grid(h, vector<int>(w, 0));
    for (int i = 0; i < n; i++) {
      for (int y = y1[i]; y < y2[i]; y++) {
        for (int x = x1[i]; x < x2[i]; x++)
          grid[y][x] = 1;
      }
    }

    int res = 0;
    for (int y = 0; y < h; y++) {
      for (int x = 0; x < w; x++) {
        if (grid[y][x] == 0) {
          bfs(y, x, grid);
          res++;
        }
      }
    }
    cout << res << endl;
  }
}

Error: 0

Fixed submission:

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

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

void dfs(int y, int x, vector<vector<int>> &g) {
  if (g[y][x] == 1)
    return;
  g[y][x] = 1;

  for (int i = 0; i < 4; i++) {
    int ny = y + dy[i], nx = x + dx[i];
    if (ny < 0 || nx < 0 || ny >= (int)g.size() || nx >= (int)g[0].size())
      continue;
    dfs(ny, nx, g);
  }
}

int main() {
  int w, h, n;
  while (cin >> w >> h) {
    if (w == 0 && h == 0)
      break;
    cin >> n;
    vector<int> cordx, cordy;
    vector<int> x1(n), y1(n), x2(n), y2(n);

    cordx.push_back(0);
    cordx.push_back(w - 1);
    cordy.push_back(0);
    cordy.push_back(h - 1);

    for (int i = 0; i < n; i++) {
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
      for (int d = -1; d <= 1; d++) {
        if (0 <= x1[i] + d && x1[i] + d < w)
          cordx.push_back(x1[i] + d);
        if (0 <= x2[i] + d && x2[i] + d < w)
          cordx.push_back(x2[i] + d);
        if (0 <= y1[i] + d && y1[i] + d < h)
          cordy.push_back(y1[i] + d);
        if (0 <= y2[i] + d && y2[i] + d < h)
          cordy.push_back(y2[i] + d);
      }
    }

    sort(cordx.begin(), cordx.end());
    cordx.erase(unique(cordx.begin(), cordx.end()), cordx.end());
    sort(cordy.begin(), cordy.end());
    cordy.erase(unique(cordy.begin(), cordy.end()), cordy.end());

    for (int i = 0; i < n; i++) {
      int val = lower_bound(cordx.begin(), cordx.end(), x1[i]) - cordx.begin();
      x1[i] = val;
      val = lower_bound(cordx.begin(), cordx.end(), x2[i]) - cordx.begin();
      x2[i] = val;
      val = lower_bound(cordy.begin(), cordy.end(), y1[i]) - cordy.begin();
      y1[i] = val;
      val = lower_bound(cordy.begin(), cordy.end(), y2[i]) - cordy.begin();
      y2[i] = val;
    }

    h = cordy.size();
    w = cordx.size();
    vector<vector<int>> grid(h, vector<int>(w, 0));
    for (int i = 0; i < n; i++) {
      for (int y = y1[i]; y < y2[i]; y++) {
        for (int x = x1[i]; x < x2[i]; x++)
          grid[y][x] = 1;
      }
    }

    int res = 0;
    for (int y = 0; y < h; y++) {
      for (int x = 0; x < w; x++) {
        if (grid[y][x] == 0) {
          dfs(y, x, grid);
          res++;
        }
      }
    }
    cout << res << endl;
  }
}