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

#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>

using namespace std;

int W, H, N;

int X1[1000], X2[1000], Y1[1000], Y2[1000];

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

bool fld[6000][6000];

int compress(int *x1, int *x2, int w) {
  vector<int> xs;

  for (int i = 0; i < N; i++) {
    for (int d = -1; d <= 1; d++) {
      int tx1 = x1[i] + d, tx2 = x2[i] + d;
      if (1 <= tx1 && tx1 <= w)
        xs.push_back(tx1);
      if (1 <= tx2 && tx2 <= w)
        xs.push_back(tx2);
    }
  }

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

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

  return xs.size();
}

int main() {

  while (1) {

    scanf("%d%d", &W, &H);

    if (W == 0)
      break;

    scanf("%d", &N);

    for (int i = 0; i < N; i++) {
      int x1, y1, x2, y2;
      scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
      X1[i] = x1 + 1;
      Y1[i] = y1 + 1;
      X2[i] = x2;
      Y2[i] = y2;
    }

    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    memset(fld, 0, sizeof(fld));
    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++) {
          fld[y][x] = true;
        }
      }
    }

    int ans = 0;
    for (int y = 0; y < H; y++) {
      for (int x = 0; x < W; x++) {
        if (fld[y][x])
          continue;
        ans++;

        queue<pair<int, int>> que;
        que.push(make_pair(x, y));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();

          for (int i = 0; i < 4; i++) {
            int tx = sx + dx[i], ty = sy + dy[i];
            if (tx < 0 || W <= tx || ty < 0 || H <= ty)
              continue;
            if (fld[ty][tx])
              continue;
            que.push(make_pair(tx, ty));
            fld[ty][tx] = true;
          }
        }
      }
    }

    printf("%d\\n", ans);
  }

  return 0;
}

Error: -11

Fixed submission:

#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>

using namespace std;

int W, H, N;

int compress(int *x1, int *x2, int w) {
  vector<int> xs;

  for (int i = 0; i < N; i++) {
    for (int d = -1; d <= 1; d++) {
      int tx1 = x1[i] + d, tx2 = x2[i] + d;
      if (1 <= tx1 && tx1 <= W)
        xs.push_back(tx1);
      if (1 <= tx2 && tx2 <= W)
        xs.push_back(tx2);
    }
  }

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

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

  return xs.size();
}

int main() {

  while (1) {

    int X1[1000], X2[1000], Y1[1000], Y2[1000];

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

    bool fld[6000][6000];

    scanf("%d%d", &W, &H);

    if (W == 0)
      break;

    scanf("%d", &N);

    for (int i = 0; i < N; i++) {
      scanf("%d%d%d%d", &X1[i], &Y1[i], &X2[i], &Y2[i]);
    }

    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    memset(fld, 0, sizeof(fld));
    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++) {
          fld[y][x] = true;
        }
      }
    }

    int ans = 0;
    for (int y = 0; y < H; y++) {
      for (int x = 0; x < W; x++) {
        if (fld[y][x])
          continue;
        ans++;

        queue<pair<int, int>> que;
        que.push(make_pair(x, y));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();

          for (int i = 0; i < 4; i++) {
            int tx = sx + dx[i], ty = sy + dy[i];
            if (tx < 0 || W <= tx || ty < 0 || H <= ty)
              continue;
            if (fld[ty][tx])
              continue;
            que.push(make_pair(tx, ty));
            fld[ty][tx] = true;
          }
        }
      }
    }

    printf("%d\\n", ans);
  }

  return 0;
}