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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;

int vis[3010][3010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int w, h;
  while (cin >> w >> h, w) {
    int n;
    cin >> n;
    int x1[1000], y1[1000], x2[1000], y2[1000];
    map<int, int> xm, ym;
    xm[0] = ym[0] = -1;
    xm[w - 1] = -1;
    ym[h - 1] = -1;
    for (int i = 0; i < n; i++) {
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
      x2[i]--, y2[i]--;
      for (int d = -1; d <= 1; d++) {
        if (0 <= x1[i] + d && x1[i] + d < w)
          xm[x1[i] + d] = -1;
        if (0 <= x2[i] + d && x2[i] + d < w)
          xm[x2[i] + d] = -1;
        if (0 <= y1[i] + d && y1[i] + d < h)
          ym[y1[i] + d] = -1;
        if (0 <= y2[i] + d && y2[i] + d < h)
          ym[y2[i] + d] = -1;
      }
    }

    int xc = 0, yc = 0;
    for (auto v : xm) {
      xm[v.first] = xc++;
    }
    for (auto v : ym) {
      ym[v.first] = yc++;
    }

    memset(vis, 0, sizeof vis);
    for (int i = 0; i < n; i++) {
      x1[i] = xm[x1[i]];
      x2[i] = xm[x2[i]];
      y1[i] = ym[y1[i]];
      y2[i] = ym[y2[i]];
      for (int y = y1[i]; y <= y2[i]; y++) {
        for (int x = x1[i]; x <= x2[i]; x++) {
          vis[y][x] = 1;
        }
      }
    }

    int ans = 0;
    for (int i = 0; i < yc; i++) {
      for (int j = 0; j < xc; j++) {
        if (vis[i][j])
          continue;
        ans++;
        vis[i][j] = 1;
        queue<P> q;
        q.push({j, i});
        int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
        while (q.size()) {
          int x = q.front().first, y = q.front().second;
          q.pop();
          for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (0 <= nx && nx < xc && 0 <= ny && ny < yc && !vis[ny][nx]) {
              vis[ny][nx] = 1;
              q.push({nx, ny});
            }
          }
        }
      }
    }
    cout << ans << endl;
  }
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;

int vis[3010][3010];
int ng[3010][3010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int w, h;
  while (cin >> w >> h, w) {
    int n;
    cin >> n;
    int x1[1000], y1[1000], x2[1000], y2[1000];
    map<int, int> xm, ym;
    xm[0] = ym[0] = -1;
    xm[w - 1] = -1;
    ym[h - 1] = -1;
    for (int i = 0; i < n; i++) {
      cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
      x2[i]--, y2[i]--;
      for (int d = -1; d <= 1; d++) {
        if (0 <= x1[i] + d && x1[i] + d < w)
          xm[x1[i] + d] = -1;
        if (0 <= x2[i] + d && x2[i] + d < w)
          xm[x2[i] + d] = -1;
        if (0 <= y1[i] + d && y1[i] + d < h)
          ym[y1[i] + d] = -1;
        if (0 <= y2[i] + d && y2[i] + d < h)
          ym[y2[i] + d] = -1;
      }
    }

    int xc = 0, yc = 0;
    for (auto v : xm) {
      xm[v.first] = xc++;
    }
    for (auto v : ym) {
      ym[v.first] = yc++;
    }

    memset(ng, 0, sizeof ng);
    for (int i = 0; i < n; i++) {
      x1[i] = xm[x1[i]];
      x2[i] = xm[x2[i]];
      y1[i] = ym[y1[i]];
      y2[i] = ym[y2[i]];
      for (int y = y1[i]; y <= y2[i]; y++) {
        for (int x = x1[i]; x <= x2[i]; x++) {
          ng[y][x] = 1;
        }
      }
    }

    memset(vis, 0, sizeof vis);
    int ans = 0;
    for (int i = 0; i < yc; i++) {
      for (int j = 0; j < xc; j++) {
        if (vis[i][j] || ng[i][j])
          continue;
        ans++;
        vis[i][j] = 1;
        queue<P> q;
        q.push({j, i});
        int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
        while (q.size()) {
          int x = q.front().first, y = q.front().second;
          q.pop();
          for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (0 <= nx && nx < xc && 0 <= ny && ny < yc && !ng[ny][nx] &&
                !vis[ny][nx]) {
              vis[ny][nx] = 1;
              q.push({nx, ny});
            }
          }
        }
      }
    }
    cout << ans << endl;
  }
}