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

#include <bits/stdc++.h>
#define r(i, n) for (int i = 0; i < n; i++)
using namespace std;
int sx[1001], sy[1001], gx[1001], gy[1001], s[1511][1511];
int dx[] = {0, 0, 1, -1}, w, h, n;
int dy[] = {1, -1, 0, 0};
vector<int> v1, v2;
map<int, int> m1, m2;
set<int> s1, s2;
void zaatsu() {
  sort(v1.begin(), v1.end());
  sort(v2.begin(), v2.end());
  v1.erase(unique(v1.begin(), v1.end()), v1.end());
  v2.erase(unique(v2.begin(), v2.end()), v2.end());
  int a = 0, b = 0;
  r(i, v1.size()) m1[v1[i]] = a, a += 2;
  r(i, v2.size()) m2[v2[i]] = b, b += 2;
}
void init() {
  s1.clear();
  s2.clear();
  v1.clear();
  v2.clear();
  m1.clear();
  m2.clear();
}
void make_map() {
  r(i, n) {
    for (int j = m2[sy[i]]; j <= m2[gy[i]]; j++)
      for (int k = m1[sx[i]]; k <= m1[gx[i]]; k++)
        s[j][k] = 1;
  }
}
void dfs(int y, int x) {
  s[y][x] = 2;
  r(i, 4) {
    int xx = x + dx[i];
    int yy = y + dy[i];
    if (xx < 0 || yy < 0 || xx >= m1[v1[v1.size() - 1]] ||
        yy >= m2[v2[v2.size() - 1]])
      continue;
    if (!s[yy][xx])
      dfs(yy, xx);
  }
}
int main() {
  while (cin >> w >> h, w) {
    int ans = 0;
    memset(s, 0, sizeof(s));
    init();
    cin >> n;
    r(i, n) {
      cin >> sx[i] >> sy[i] >> gx[i] >> gy[i];
      if (!s1.count(sx[i]))
        v1.push_back(sx[i]), s1.insert(sx[i]);
      if (!s2.count(sy[i]))
        v2.push_back(sy[i]), s2.insert(sy[i]);
      if (!s1.count(gx[i]))
        v1.push_back(gx[i]), s1.insert(gx[i]);
      if (!s2.count(gy[i]))
        v2.push_back(gy[i]), s2.insert(gy[i]);
    }
    v1.push_back(0);
    v2.push_back(0);
    v1.push_back(w);
    v2.push_back(h);
    zaatsu();
    make_map();
    r(i, m2[v2[v2.size() - 1]]) {
      r(j, m1[v1[v1.size() - 1]]) {
        if (!s[i][j])
          ans++, dfs(i, j);
      }
    }
    cout << ans << endl;
  }
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
#define r(i, n) for (int i = 0; i < n; i++)
using namespace std;
int sx[1001], sy[1001], gx[1001], gy[1001], s[3111][3111];
int dx[] = {0, 0, 1, -1}, w, h, n;
int dy[] = {1, -1, 0, 0};
vector<int> v1, v2;
map<int, int> m1, m2;
set<int> s1, s2;
void zaatsu() {
  sort(v1.begin(), v1.end());
  sort(v2.begin(), v2.end());
  v1.erase(unique(v1.begin(), v1.end()), v1.end());
  v2.erase(unique(v2.begin(), v2.end()), v2.end());
  int a = 0, b = 0;
  r(i, v1.size()) m1[v1[i]] = a, a += 3;
  r(i, v2.size()) m2[v2[i]] = b, b += 3;
}
void init() {
  s1.clear();
  s2.clear();
  v1.clear();
  v2.clear();
  m1.clear();
  m2.clear();
}
void make_map() {
  r(i, n) {
    for (int j = m2[sy[i]]; j <= m2[gy[i]]; j++)
      for (int k = m1[sx[i]]; k <= m1[gx[i]]; k++)
        s[j][k] = 1;
  }
}
void dfs(int y, int x) {
  s[y][x] = 2;
  r(i, 4) {
    int xx = x + dx[i];
    int yy = y + dy[i];
    if (xx < 0 || yy < 0 || xx >= m1[v1[v1.size() - 1]] ||
        yy >= m2[v2[v2.size() - 1]])
      continue;
    if (!s[yy][xx])
      dfs(yy, xx);
  }
}
int main() {
  while (cin >> w >> h, w) {
    int ans = 0;
    memset(s, 0, sizeof(s));
    init();
    cin >> n;
    r(i, n) {
      cin >> sx[i] >> sy[i] >> gx[i] >> gy[i];
      if (!s1.count(sx[i]))
        v1.push_back(sx[i]), s1.insert(sx[i]);
      if (!s2.count(sy[i]))
        v2.push_back(sy[i]), s2.insert(sy[i]);
      if (!s1.count(gx[i]))
        v1.push_back(gx[i]), s1.insert(gx[i]);
      if (!s2.count(gy[i]))
        v2.push_back(gy[i]), s2.insert(gy[i]);
    }
    v1.push_back(0);
    v2.push_back(0);
    v1.push_back(w);
    v2.push_back(h);
    zaatsu();
    make_map();
    r(i, m2[v2[v2.size() - 1]]) {
      r(j, m1[v1[v1.size() - 1]]) {
        if (!s[i][j])
          ans++, dfs(i, j);
      }
    }
    cout << ans << endl;
  }
}