Problem p00454 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define INF INT_MAX / 2
#define EPS 1.0e-7

#define MAX_NUM 1000

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

int W, H;
int N;

int vx[MAX_NUM * 2];
int vy[MAX_NUM * 2];

int flag[6 * MAX_NUM + 1][6 * MAX_NUM + 1];

int compress(int *v, int n, int l) {

  vector<int> cv;
  for (int i = 0; i < n; ++i)
    for (int d = -1; d <= 1; ++d)
      if (0 <= v[i] + d && v[i] + d <= l - 1)
        cv.push_back(v[i] + d);

  sort(cv.begin(), cv.end());
  int ret = unique(cv.begin(), cv.end()) - cv.begin();

  for (int i = 0; i < n; ++i)
    v[i] = lower_bound(cv.begin(), cv.begin() + ret, v[i]) - cv.begin();

  return ret;
}

int main() {

  cin.sync_with_stdio(false);

  while (cin >> W >> H, W) {

    cin >> N;

    for (int i = 0; i < N; ++i)
      cin >> vx[2 * i] >> vy[2 * i] >> vx[2 * i + 1] >> vy[2 * i + 1];

    int w = compress(vx, 2 * N, W);
    int h = compress(vy, 2 * N, H);

    memset(flag, 0, sizeof(flag));

    for (int i = 0; i < N; ++i)
      for (int ix = vx[2 * i]; ix < vx[2 * i + 1]; ++ix)
        for (int iy = vy[2 * i]; iy < vy[2 * i + 1]; ++iy) {
          flag[ix][iy] = 1;
        }

    int ans = 0;

    for (int i = 0; i < w; ++i) {

      for (int j = 0; j < h; ++j) {

        if (flag[i][j])
          continue;

        ++ans;

        queue<PII> q;
        q.push(make_pair(i, j));
        flag[i][j] = 1;

        while (!q.empty()) {

          PII p = q.front();
          q.pop();
          int x = p.first;
          int y = p.second;

          const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

          for (int k = 0; k < 4; ++k) {

            int nx = x + d[k][0];
            int ny = y + d[k][1];

            if (!(0 <= nx && nx < w && 0 <= ny && ny < h) || flag[nx][ny])
              continue;
            flag[nx][ny] = 1;
            q.push(make_pair(nx, ny));
          }
        }
      }
    }

    cout << ans << endl;
  }

  return 0;
}

Fixed submission:
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define INF INT_MAX / 2
#define EPS 1.0e-7

#define MAX_NUM 1000

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

int W, H;
int N;

int vx[MAX_NUM * 2];
int vy[MAX_NUM * 2];

char flag[6 * MAX_NUM + 1][6 * MAX_NUM + 1];

int compress(int *v, int n, int l) {

  vector<int> cv;
  for (int i = 0; i < n; ++i)
    for (int d = -1; d <= 1; ++d)
      if (0 <= v[i] + d && v[i] + d <= l - 1)
        cv.push_back(v[i] + d);

  sort(cv.begin(), cv.end());
  int ret = unique(cv.begin(), cv.end()) - cv.begin();

  for (int i = 0; i < n; ++i)
    v[i] = lower_bound(cv.begin(), cv.begin() + ret, v[i]) - cv.begin();

  return ret;
}

int main() {

  cin.sync_with_stdio(false);

  while (cin >> W >> H, W) {

    cin >> N;

    for (int i = 0; i < N; ++i)
      cin >> vx[2 * i] >> vy[2 * i] >> vx[2 * i + 1] >> vy[2 * i + 1];

    int w = compress(vx, 2 * N, W);
    int h = compress(vy, 2 * N, H);

    memset(flag, 0, sizeof(flag));

    for (int i = 0; i < N; ++i)
      for (int ix = vx[2 * i]; ix < vx[2 * i + 1]; ++ix)
        for (int iy = vy[2 * i]; iy < vy[2 * i + 1]; ++iy) {
          flag[ix][iy] = 1;
        }

    int ans = 0;

    for (int i = 0; i < w; ++i) {

      for (int j = 0; j < h; ++j) {

        if (flag[i][j])
          continue;

        ++ans;

        queue<PII> q;
        q.push(make_pair(i, j));
        flag[i][j] = 1;

        while (!q.empty()) {

          PII p = q.front();
          q.pop();
          int x = p.first;
          int y = p.second;

          const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

          for (int k = 0; k < 4; ++k) {

            int nx = x + d[k][0];
            int ny = y + d[k][1];

            if (!(0 <= nx && nx < w && 0 <= ny && ny < h) || flag[nx][ny])
              continue;
            flag[nx][ny] = 1;
            q.push(make_pair(nx, ny));
          }
        }
      }
    }

    cout << ans << endl;
  }

  return 0;
}