Problem p00454 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define rrep(i, n) for (int i = 1; i <= n; i++)
#define drep(i, n) for (int i = n; i >= 0; i--)
#define MAX 1001
#define ll long long
#define dmp make_pair
#define dpb push_back
#define P pair<int, int>
#define fi first
#define se second
using namespace std;
//__gcd(a,b), __builtin_popcount(a);
const int inf = 1e9;
const ll INF = 1e18;
const int size = 6002;
#define B 100

int n, dy[4] = {0, -1, 1, 0}, dx[4] = {-1, 0, 0, 1};
queue<P> q;
int X1[MAX], X2[MAX], Y1[MAX], Y2[MAX];

int compress1(int w) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int t1 = X1[i] + j, t2 = X2[i] + j;
      if (0 <= t1 && t1 <= w)
        xs.push_back(t1);
      if (0 <= t2 && t2 <= w)
        xs.push_back(t2);
    }
  }
  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() + 1;
    X2[i] = find(xs.begin(), xs.end(), X2[i]) - xs.begin() + 1;
  }
  return xs.size() - 1;
}

int compress2(int h) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int t1 = Y1[i] + j, t2 = Y2[i] + j;
      if (0 <= t1 && t1 <= h)
        xs.push_back(t1);
      if (0 <= t2 && t2 <= h)
        xs.push_back(t2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (int i = 0; i < n; i++) {
    Y1[i] = find(xs.begin(), xs.end(), Y1[i]) - xs.begin() + 1;
    Y2[i] = find(xs.begin(), xs.end(), Y2[i]) - xs.begin() + 1;
  }
  return xs.size() - 1;
}

bool a[size][size];
int b[size][size];
void paint(int w, int h) {
  fill((int *)b, (int *)(b + size), 0);
  for (int i = 0; i < n; i++) {
    for (int y = Y1[i]; y < Y2[i]; y++) {
      b[y][X1[i]]++;
      b[y][X2[i]]--;
    }
  }
  for (int y = 1; y <= h; y++) {
    for (int x = 1; x <= w; x++) {
      b[y][x] += b[y][x - 1];
      // printf("%d ", b[y][x]);
      if (b[y][x] > 0)
        a[y][x] = 1;
    }
    // printf("\n");
  }
}

int bfs(int w, int h) {
  int ans = 0, tx, ty, yy, xx;
  for (int y = 1; y <= h; y++) {
    for (int x = 1; x <= w; x++) {
      if (a[y][x])
        continue;
      q.push(dmp(y, x));
      ans++;
      while (!q.empty()) {
        P p = q.front();
        q.pop();
        yy = p.fi;
        xx = p.se;
        a[yy][xx] = true;
        for (int i = 0; i < 4; i++) {
          ty = yy + dy[i];
          tx = xx + dx[i];
          if (!a[ty][tx]) {
            a[ty][tx] = true;
            q.push(dmp(ty, tx));
          }
        }
      }
    }
  }
  return ans;
}

int main() {
  int w, h;
  while (1) {
    scanf("%d%d", &w, &h);
    if (!w)
      break;
    scanf("%d", &n);
    fill((bool *)a, (bool *)(a + size), true);
    rep(i, n) { scanf("%d%d%d%d", &X1[i], &Y1[i], &X2[i], &Y2[i]); }

    w = compress1(w);
    h = compress2(h);
    rrep(i, h) rrep(j, w) a[i][j] = false;
    paint(w, h);
    int ans = bfs(w, h);

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

Fixed submission:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define rrep(i, n) for (int i = 1; i <= n; i++)
#define drep(i, n) for (int i = n; i >= 0; i--)
#define MAX 1001
#define ll long long
#define dmp make_pair
#define dpb push_back
#define P pair<int, int>
#define fi first
#define se second
using namespace std;
//__gcd(a,b), __builtin_popcount(a);
const int inf = 1e9;
const ll INF = 1e18;
const int size = 3002;
#define B 100

int n, dy[4] = {0, -1, 1, 0}, dx[4] = {-1, 0, 0, 1};
queue<P> q;
int X1[MAX], X2[MAX], Y1[MAX], Y2[MAX];

int compress1(int w) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int t1 = X1[i] + j, t2 = X2[i] + j;
      if (0 <= t1 && t1 <= w)
        xs.push_back(t1);
      if (0 <= t2 && t2 <= w)
        xs.push_back(t2);
    }
  }
  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() + 1;
    X2[i] = find(xs.begin(), xs.end(), X2[i]) - xs.begin() + 1;
  }
  return xs.size() - 1;
}

int compress2(int h) {
  vector<int> xs;
  for (int i = 0; i < n; i++) {
    for (int j = -1; j <= 1; j++) {
      int t1 = Y1[i] + j, t2 = Y2[i] + j;
      if (0 <= t1 && t1 <= h)
        xs.push_back(t1);
      if (0 <= t2 && t2 <= h)
        xs.push_back(t2);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (int i = 0; i < n; i++) {
    Y1[i] = find(xs.begin(), xs.end(), Y1[i]) - xs.begin() + 1;
    Y2[i] = find(xs.begin(), xs.end(), Y2[i]) - xs.begin() + 1;
  }
  return xs.size() - 1;
}

bool a[size][size];
int b[size][size];
void paint(int w, int h) {
  fill((int *)b, (int *)(b + size), 0);
  for (int i = 0; i < n; i++) {
    for (int y = Y1[i]; y < Y2[i]; y++) {
      b[y][X1[i]]++;
      b[y][X2[i]]--;
    }
  }
  for (int y = 1; y <= h; y++) {
    for (int x = 1; x <= w; x++) {
      b[y][x] += b[y][x - 1];
      // printf("%d ", b[y][x]);
      if (b[y][x] > 0)
        a[y][x] = 1;
    }
    // printf("\n");
  }
}

int bfs(int w, int h) {
  int ans = 0, tx, ty, yy, xx;
  for (int y = 1; y <= h; y++) {
    for (int x = 1; x <= w; x++) {
      if (a[y][x])
        continue;
      q.push(dmp(y, x));
      ans++;
      while (!q.empty()) {
        P p = q.front();
        q.pop();
        yy = p.fi;
        xx = p.se;
        a[yy][xx] = true;
        for (int i = 0; i < 4; i++) {
          ty = yy + dy[i];
          tx = xx + dx[i];
          if (!a[ty][tx]) {
            a[ty][tx] = true;
            q.push(dmp(ty, tx));
          }
        }
      }
    }
  }
  return ans;
}

int main() {
  int w, h;
  while (1) {
    scanf("%d%d", &w, &h);
    if (!w)
      break;
    scanf("%d", &n);
    fill((bool *)a, (bool *)(a + size), true);
    rep(i, n) { scanf("%d%d%d%d", &X1[i], &Y1[i], &X2[i], &Y2[i]); }

    w = compress1(w);
    h = compress2(h);
    rrep(i, h) rrep(j, w) a[i][j] = false;
    paint(w, h);
    int ans = bfs(w, h);

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