Problem p00454 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define PB push_back
#define MP make_pair
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define ALL(a) (a).begin(), (a).end()
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int INF = 1e9;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int W, H, N;
int X1[1000], X2[1000], Y1[1000], Y2[1000];
int f[3030][3030];
int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  for (int i = 0; i < N; i++) {
    if (1 <= x1[i] && x1[i] < w)
      xs.PB(x1[i]);
    if (1 <= x2[i] && x2[i] < w)
      xs.PB(x2[i]);
  }
  xs.PB(0);
  xs.PB(w);
  sort(ALL(xs));
  xs.erase(unique(ALL(xs)), xs.end());
  REP(i, N) {
    x1[i] = find(ALL(xs), x1[i]) - xs.begin();
    x2[i] = find(ALL(xs), x2[i]) - xs.begin();
  }
  return xs.size() - 1;
}
int main() {
  while (1) {
    memset(f, 0, sizeof(f));
    cin >> W >> H >> N;
    if (W == 0 && H == 0 && N == 0)
      break;
    REP(i, N) { cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i]; }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);
    for (int i = 0; i < N; i++) {
      f[Y1[i]][X1[i]]++;
      f[Y2[i]][X2[i]]++;
      f[Y1[i]][X2[i]]--;
      f[Y2[i]][X1[i]]--;
    }
    REP(i, H) REP(j, W) {
      if (i != 0)
        f[i][j] += f[i - 1][j];
      if (j != 0)
        f[i][j] += f[i][j - 1];
      if (i != 0 && j != 0)
        f[i][j] -= f[i - 1][j - 1];
    }
    int ans = 0;
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (f[i][j])
          continue;
        ans++;
        queue<P> q;
        q.push(MP(j, i));
        while (!q.empty()) {
          int tx = q.front().first, ty = q.front().second;
          q.pop();
          for (int k = 0; k < 4; k++) {
            int nx = tx + dx[k], ny = ty + dy[k];
            if (nx < 0 || nx > W || ny < 0 || ny > H || f[ny][nx] > 0)
              continue;
            q.push(MP(nx, ny));
            f[ny][nx] = 1;
          }
        }
      }
    }
    cout << ans << endl;
  }
}

Fixed submission:
#include <bits/stdc++.h>
#define PB push_back
#define MP make_pair
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define ALL(a) (a).begin(), (a).end()
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int INF = 1e9;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int W, H, N;
int X1[1000], X2[1000], Y1[1000], Y2[1000];
int f[3030][3030];
int compress(int *x1, int *x2, int w) {
  vector<int> xs;
  for (int i = 0; i < N; i++) {
    if (1 <= x1[i] && x1[i] < w)
      xs.PB(x1[i]);
    if (1 <= x2[i] && x2[i] < w)
      xs.PB(x2[i]);
  }
  xs.PB(0);
  xs.PB(w);
  sort(ALL(xs));
  xs.erase(unique(ALL(xs)), xs.end());
  REP(i, N) {
    x1[i] = find(ALL(xs), x1[i]) - xs.begin();
    x2[i] = find(ALL(xs), x2[i]) - xs.begin();
  }
  return xs.size() - 1;
}
int main() {
  while (1) {
    memset(f, 0, sizeof(f));
    cin >> W >> H >> N;
    if (W == 0 && H == 0)
      break;
    REP(i, N) { cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i]; }
    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);
    for (int i = 0; i < N; i++) {
      f[Y1[i]][X1[i]]++;
      f[Y2[i]][X2[i]]++;
      f[Y1[i]][X2[i]]--;
      f[Y2[i]][X1[i]]--;
    }
    REP(i, H) REP(j, W) {
      if (i != 0)
        f[i][j] += f[i - 1][j];
      if (j != 0)
        f[i][j] += f[i][j - 1];
      if (i != 0 && j != 0)
        f[i][j] -= f[i - 1][j - 1];
    }
    int ans = 0;
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (f[i][j])
          continue;
        ans++;
        queue<P> q;
        q.push(MP(j, i));
        while (!q.empty()) {
          int tx = q.front().first, ty = q.front().second;
          q.pop();
          for (int k = 0; k < 4; k++) {
            int nx = tx + dx[k], ny = ty + dy[k];
            if (nx < 0 || nx > W || ny < 0 || ny > H || f[ny][nx] > 0)
              continue;
            q.push(MP(nx, ny));
            f[ny][nx] = 1;
          }
        }
      }
    }
    cout << ans << endl;
  }
}