Problem p00454 (C++) — buggy submission, verdict: Memory Limit Exceeded

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

typedef pair<int, int> P;

int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int h, w, n;
bool filled[6000][6000];

int compress(int *x1, int *x2, int len) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int nx1 = x1[i] + j, nx2 = x2[i] + j;
      if (nx1 >= 0 && nx1 < len)
        xs.push_back(nx1);
      if (nx2 >= 0 && nx2 < len)
        xs.push_back(nx2);
    }
  }
  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) {
    cin >> w >> h;
    if (!h && !w)
      break;
    cin >> n;
    for (int i = 0; i < 6000; i++)
      for (int j = 0; j < 6000; j++)
        filled[i][j] = 0;
    int x1[1000], x2[1000], y1[1000], y2[1000];
    for (int i = 0; i < n; i++) {
      int a, b, c, d;
      cin >> a >> b >> c >> d;
      x1[i] = a;
      y1[i] = b;
      x2[i] = c - 1;
      y2[i] = d - 1;
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    for (int i = 0; i < n; i++) {
      for (int j = x1[i]; j <= x2[i]; j++) {
        for (int k = y1[i]; k <= y2[i]; k++) {
          filled[j][k] = true;
        }
      }
    }
    /*for(int i = h - 1;i >= 0;i--){
            for(int j = 0;j < w;j++){
                    cout << filled[j][i];
            }
            cout << endl;
    }*/
    queue<P> que;
    int cnt = 0;
    for (int i = 0; i < w; i++) {
      for (int j = 0; j < h; j++) {
        if (filled[i][j])
          continue;
        cnt++;
        que.push(P(i, j));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();
          for (int i = 0; i < 4; i++) {
            int x = sx + dx[i], y = sy + dy[i];
            if (x >= 0 && x < w && y >= 0 && y < h && !filled[x][y]) {
              que.push(P(x, y));
              filled[x][y] = true;
            }
          }
        }
      }
    }
    cout << cnt << endl;
  }
  return 0;
}

Error: MLE

Fixed submission:

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

typedef pair<int, int> P;

int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int h, w, n;
int filled[6000][6000];

int compress(int *x1, int *x2, int len) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int nx1 = x1[i] + j, nx2 = x2[i] + j;
      if (nx1 >= 0 && nx1 < len)
        xs.push_back(nx1);
      if (nx2 >= 0 && nx2 < len)
        xs.push_back(nx2);
    }
  }
  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) {
    cin >> w >> h;
    if (!h && !w)
      break;
    cin >> n;
    for (int i = 0; i < 6000; i++)
      for (int j = 0; j < 6000; j++)
        filled[i][j] = 0;
    int x1[1000], x2[1000], y1[1000], y2[1000];
    for (int i = 0; i < n; i++) {
      int a, b, c, d;
      cin >> a >> b >> c >> d;
      x1[i] = a;
      y1[i] = b;
      x2[i] = c - 1;
      y2[i] = d - 1;
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    for (int i = 0; i < n; i++) {
      for (int j = x1[i]; j <= x2[i]; j++) {
        for (int k = y1[i]; k <= y2[i]; k++) {
          filled[j][k]++;
        }
      }
    }
    /*for(int i = h - 1;i >= 0;i--){
            for(int j = 0;j < w;j++){
                    cout << filled[j][i];
            }
            cout << endl;
    }*/
    queue<P> que;
    int cnt = 0;
    for (int i = 0; i < w; i++) {
      for (int j = 0; j < h; j++) {
        if (filled[i][j])
          continue;
        cnt++;
        que.push(P(i, j));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();
          for (int i = 0; i < 4; i++) {
            int x = sx + dx[i], y = sy + dy[i];
            if (x >= 0 && x < w && y >= 0 && y < h && !filled[x][y]) {
              que.push(P(x, y));
              filled[x][y] = 1;
            }
          }
        }
      }
    }
    cout << cnt << endl;
  }
  return 0;
}