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

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> P;
int compress(int *, int *, int);
void bfs(int, int);
int n, W, H;
int xa[1000], xb[1000], ya[1000], yb[1000];
bool pt[5000][5000] = {};
int main() {
  int w, h, ans = 0;
  while (cin >> w >> h && w && h) {
    cin >> n;
    ans = 0;
    memset(pt, 0, sizeof(pt));
    for (int i = 0; i < n; i++) {
      scanf("%d%d%d%d", &xa[i], &ya[i], &xb[i], &yb[i]);
    }
    W = compress(xa, xb, w);
    H = compress(ya, yb, h);
    for (int i = 0; i < n; i++) {
      for (int j = xa[i]; j < xb[i]; j++) {
        for (int k = ya[i]; k < yb[i]; k++) {
          pt[k][j] = 1;
        }
      }
    }
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (!pt[i][j]) {
          bfs(i, j);
          ans++;
        }
      }
    }
    cout << ans << endl;
  }
}

int compress(int *x1, int *x2, int lim) {
  vector<int> vec;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int a = x1[i] + j, b = x2[i] + j;
      if (a >= 0 && a < lim)
        vec.push_back(a);
      if (b >= 0 && b < lim)
        vec.push_back(b);
    }
  }
  sort(vec.begin(), vec.end());
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  for (int i = 0; i < n; i++) {
    x1[i] = find(vec.begin(), vec.end(), x1[i]) - vec.begin();
    x2[i] = find(vec.begin(), vec.end(), x2[i]) - vec.begin();
  }
  return vec.size();
}

void bfs(int x, int y) {
  queue<P> que;
  que.push(P(x, y));
  while (!que.empty()) {
    P p = que.front();
    que.pop();
    for (int i = -1; i <= 1; i++) {
      if (i) {
        int a = p.first + i, b = p.second + i;
        if (a >= 0 && a < H && !pt[a][p.second]) {
          pt[a][p.second] = 1;
          que.push(P(a, p.second));
        }
        if (b >= 0 && b < W && !pt[p.first][b]) {
          pt[p.first][b] = 1;
          que.push(P(p.first, b));
        }
      }
    }
  }
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> P;
int compress(int *, int *, int);
void bfs(int, int);
int n, W, H;
int xa[1000], xb[1000], ya[1000], yb[1000], pt[5000][5000] = {};
int main() {
  int w, h, ans = 0;
  while (cin >> w >> h && w && h) {
    cin >> n;
    memset(pt, 0, sizeof(pt));
    ans = 0;
    for (int i = 0; i < n; i++) {
      scanf("%d%d%d%d", &xa[i], &ya[i], &xb[i], &yb[i]);
    }
    W = compress(xa, xb, w);
    H = compress(ya, yb, h);
    for (int i = 0; i < n; i++) {
      for (int j = xa[i]; j < xb[i]; j++) {
        for (int k = ya[i]; k < yb[i]; k++) {
          pt[k][j] = -1;
        }
      }
    }
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (!pt[i][j]) {
          bfs(i, j);
          ans++;
        }
      }
    }
    cout << ans << endl;
  }
}

int compress(int *x1, int *x2, int lim) {
  vector<int> vec;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int a = x1[i] + j, b = x2[i] + j;
      if (a >= 0 && a < lim)
        vec.push_back(a);
      if (b >= 0 && b < lim)
        vec.push_back(b);
    }
  }
  sort(vec.begin(), vec.end());
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  for (int i = 0; i < n; i++) {
    x1[i] = find(vec.begin(), vec.end(), x1[i]) - vec.begin();
    x2[i] = find(vec.begin(), vec.end(), x2[i]) - vec.begin();
  }
  return vec.size();
}

void bfs(int x, int y) {
  queue<P> que;
  que.push(P(x, y));
  while (!que.empty()) {
    P p = que.front();
    que.pop();
    for (int i = -1; i <= 1; i++) {
      if (i) {
        int a = p.first + i, b = p.second + i;
        if (a >= 0 && a < H && !pt[a][p.second]) {
          pt[a][p.second] = 1;
          que.push(P(a, p.second));
        }
        if (b >= 0 && b < W && !pt[p.first][b]) {
          pt[p.first][b] = 1;
          que.push(P(p.first, b));
        }
      }
    }
  }
}