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

#include <bits/stdc++.h>

using namespace std;

typedef complex<int> P;

int compress(vector<int> &x1, vector<int> &x2, int w) {
  vector<int> needX;
  needX.push_back(0);
  needX.push_back(w);
  for (int i = 0; i < x1.size(); ++i) {
    for (int j = -1; j <= 1; ++j) {
      int x = x1[i] + j;
      if (0 <= x && x < w)
        needX.push_back(x);
    }
  }
  for (int i = 0; i < x2.size(); ++i) {
    for (int j = -1; j <= 1; ++j) {
      int x = x2[i] + j;
      if (0 <= x && x < w)
        needX.push_back(x);
    }
  }
  sort(needX.begin(), needX.end());
  needX.erase(unique(needX.begin(), needX.end()), needX.end());

  for (int i = 0; i < x1.size(); ++i) {
    x1[i] = find(needX.begin(), needX.end(), x1[i]) - needX.begin();
  }
  for (int i = 0; i < x2.size(); ++i) {
    x2[i] = find(needX.begin(), needX.end(), x2[i]) - needX.begin();
  }

  return find(needX.begin(), needX.end(), w) - needX.begin();
}

char m[6100][6100];

void paint(int x, int y, int w, int h) {
  stack<P> S;
  S.push(P(x, y));
  while (!S.empty()) {
    P p = S.top();
    S.pop();
    int x = p.real(), y = p.imag();

    if (x < 0 || x >= w || y < 0 || y >= h)
      continue;
    if (m[y][x])
      continue;

    m[y][x] = 1;

    S.push(P(x + 1, y));
    S.push(P(x - 1, y));
    S.push(P(x, y + 1));
    S.push(P(x, y - 1));
  }
}
int main() {
  int W, H;
  while (cin >> W >> H, W || H) {
    fill(&m[0][0], &m[0][0] + 6100 * 6100, (char)0);

    int N;
    cin >> N;
    vector<int> X1(N), Y1(N), X2(N), Y2(N);
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
      --X2[i], --Y2[i];
    }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    for (int i = 0; i < N; ++i) {
      int x1 = X1[i], y1 = Y1[i], x2 = X2[i], y2 = Y2[i];

      ++m[y1][x1];
      --m[y2 + 1][x1];

      --m[y1][x2 + 1];
      ++m[y2 + 1][x2 + 1];
    }

    for (int y = 0; y < H; ++y) {
      for (int x = 0; x <= W; ++x) {
        m[y + 1][x] += m[y][x];
      }
    }
    for (int y = 0; y <= H; ++y) {
      for (int x = 0; x < W; ++x) {
        m[y][x + 1] += m[y][x];
      }
    }

    int ans = 0;
    for (int y = 0; y < H; ++y) {
      for (int x = 0; x < W; ++x) {
        if (!m[y][x]) {
          paint(x, y, W, H);
          ++ans;
        }
      }
    }
    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

int compress(vector<int> &x1, vector<int> &x2, int w) {
  vector<int> needX;
  needX.push_back(0);
  needX.push_back(w);
  for (int i = 0; i < x1.size(); ++i) {
    for (int j = -1; j <= 1; ++j) {
      int x = x1[i] + j;
      if (0 <= x && x < w)
        needX.push_back(x);
    }
  }
  for (int i = 0; i < x2.size(); ++i) {
    for (int j = -1; j <= 1; ++j) {
      int x = x2[i] + j;
      if (0 <= x && x < w)
        needX.push_back(x);
    }
  }
  sort(needX.begin(), needX.end());
  needX.erase(unique(needX.begin(), needX.end()), needX.end());

  for (int i = 0; i < x1.size(); ++i) {
    x1[i] = find(needX.begin(), needX.end(), x1[i]) - needX.begin();
  }
  for (int i = 0; i < x2.size(); ++i) {
    x2[i] = find(needX.begin(), needX.end(), x2[i]) - needX.begin();
  }

  return find(needX.begin(), needX.end(), w) - needX.begin();
}

char m[6100][6100];

void paint(int x, int y, int w, int h) {
  if (x < 0 || x >= w || y < 0 || y >= h)
    return;
  if (m[y][x])
    return;

  m[y][x] = 1;

  paint(x + 1, y, w, h);
  paint(x - 1, y, w, h);
  paint(x, y + 1, w, h);
  paint(x, y - 1, w, h);
}
int main() {
  int W, H;
  while (cin >> W >> H, W || H) {
    for (int i = 0; i < H * 6 + 100; ++i)
      for (int j = 0; j < W * 6 + 100; ++j)
        m[i][j] = 0;

    int N;
    cin >> N;
    vector<int> X1(N), Y1(N), X2(N), Y2(N);
    for (int i = 0; i < N; ++i) {
      cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
      --X2[i], --Y2[i];
    }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    for (int i = 0; i < N; ++i) {
      int x1 = X1[i], y1 = Y1[i], x2 = X2[i], y2 = Y2[i];

      ++m[y1][x1];
      --m[y2 + 1][x1];

      --m[y1][x2 + 1];
      ++m[y2 + 1][x2 + 1];
    }

    for (int y = 0; y < H; ++y) {
      for (int x = 0; x <= W; ++x) {
        m[y + 1][x] += m[y][x];
      }
    }
    for (int y = 0; y <= H; ++y) {
      for (int x = 0; x < W; ++x) {
        m[y][x + 1] += m[y][x];
      }
    }

    int ans = 0;
    for (int y = 0; y < H; ++y) {
      for (int x = 0; x < W; ++x) {
        if (!m[y][x]) {
          paint(x, y, W, H);
          ++ans;
        }
      }
    }
    cout << ans << endl;
  }
}