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

// Bokan ga bokka--nn!!
// Daily Lunch Special Tanoshii !!
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <algorithm>
#include <cassert>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef pair<int, int> P;
typedef pair<int, P> P1;
typedef pair<P, P> P2;
typedef long long ll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
#define f first
#define s second
#define rep(i, x) for (int i = 0; i < x; i++)
bool f[4005][4005];
int x1[1005], y1[1005], x2[1005], y2[1005], w, h, n;
int main() {
  srand((unsigned int)time(NULL));
  while (1) {
    vector<int> x, y;
    scanf("%d %d %d", &w, &h, &n);
    if (!w)
      return 0;
    for (int i = 0; i < n; i++) {
      scanf("%d", &x1[i]);
      scanf("%d", &y1[i]);
      scanf("%d", &x2[i]);
      scanf("%d", &y2[i]);
      x.pb(x1[i]);
      if (x1[i])
        x.pb(x1[i] - 1);
      x.pb(x2[i] - 1);
      if (x2[i] != w)
        x.pb(x2[i]);
      y.pb(y1[i]);
      if (y1[i])
        y.pb(y1[i] - 1);
      y.pb(y2[i] - 1);
      if (y2[i] != h)
        y.pb(y2[i]);
    }
    x.pb(0);
    x.pb(w - 1);
    y.pb(0);
    y.pb(h - 1);
    sort(x.begin(), x.end());
    sort(y.begin(), y.end());
    x.erase(unique(x.begin(), x.end()), x.end());
    y.erase(unique(y.begin(), y.end()), y.end());
    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        f[i][j] = false;
      }
    }
    for (int i = 0; i < n; i++) {
      int a = lower_bound(x.begin(), x.end(), x1[i]) - x.begin();
      int b = lower_bound(x.begin(), x.end(), x2[i] - 1) - x.begin();
      int c = lower_bound(y.begin(), y.end(), y1[i]) - y.begin();
      int d = lower_bound(y.begin(), y.end(), y2[i] - 1) - y.begin();
      for (int j = a; j <= b; j++) {
        for (int k = c; k <= d; k++) {
          f[j][k] = true;
        }
      }
    }
    int ret = 0;

    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        if (!f[i][j]) {
          ret++;
          queue<P> que;
          que.push(mp(i, j));
          while (!que.empty()) {
            P p = que.front();
            que.pop();
            if (f[p.f][p.s])
              continue;
            f[p.f][p.s] = true;
            int dx[4] = {0, 1, 0, -1};
            int dy[4] = {1, 0, -1, 0};
            for (int k = 0; k < 4; k++) {
              int nx = p.f + dx[k];
              int ny = p.s + dy[k];
              if (!(0 <= nx && nx < x.size()))
                continue;
              if (!(0 <= ny && ny < y.size()))
                continue;
              if (f[nx][ny])
                continue;
              que.push(mp(nx, ny));
            }
          }
        }
      }
    }
    printf("%d\\n", ret);
  }
}

Error: TLE

Fixed submission:

// Bokan ga bokka--nn!!
// Daily Lunch Special Tanoshii !!
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <algorithm>
#include <cassert>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef pair<int, int> P;
typedef pair<int, P> P1;
typedef pair<P, P> P2;
typedef long long ll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
#define f first
#define s second
#define rep(i, x) for (int i = 0; i < x; i++)
bool f[4005][4005];
int x1[1005], y1[1005], x2[1005], y2[1005], w, h, n;
int main() {
  srand((unsigned int)time(NULL));
  while (1) {
    vector<int> x, y;
    scanf("%d %d %d", &w, &h, &n);
    for (int i = 0; i < n; i++) {
      scanf("%d", &x1[i]);
      scanf("%d", &y1[i]);
      scanf("%d", &x2[i]);
      scanf("%d", &y2[i]);
      x.pb(x1[i]);
      if (x1[i])
        x.pb(x1[i] - 1);
      x.pb(x2[i] - 1);
      x.pb(x2[i]);
      y.pb(y1[i]);
      if (y1[i])
        y.pb(y1[i] - 1);
      y.pb(y2[i] - 1);
      y.pb(y2[i]);
    }
    x.pb(0);
    x.pb(w - 1);
    y.pb(0);
    y.pb(h - 1);
    sort(x.begin(), x.end());
    sort(y.begin(), y.end());
    x.erase(unique(x.begin(), x.end()), x.end());
    y.erase(unique(y.begin(), y.end()), y.end());
    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        f[i][j] = false;
      }
    }
    for (int i = 0; i < n; i++) {
      int a = lower_bound(x.begin(), x.end(), x1[i]) - x.begin();
      int b = lower_bound(x.begin(), x.end(), x2[i] - 1) - x.begin();
      int c = lower_bound(y.begin(), y.end(), y1[i]) - y.begin();
      int d = lower_bound(y.begin(), y.end(), y2[i] - 1) - y.begin();
      for (int j = a; j <= b; j++) {
        for (int k = c; k <= d; k++) {
          f[j][k] = true;
        }
      }
    }
    int ret = 0;
    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        if (!f[i][j]) {
          ret++;
          queue<P> que;
          que.push(mp(i, j));
          while (!que.empty()) {
            P p = que.front();
            que.pop();
            if (f[p.f][p.s])
              continue;
            f[p.f][p.s] = true;
            int dx[4] = {0, 1, 0, -1};
            int dy[4] = {1, 0, -1, 0};
            for (int k = 0; k < 4; k++) {
              int nx = p.f + dx[k];
              int ny = p.s + dy[k];
              if (!(0 <= nx && nx < x.size()))
                continue;
              if (!(0 <= ny && ny < y.size()))
                continue;
              if (f[nx][ny])
                continue;
              que.push(mp(nx, ny));
            }
          }
        }
      }
    }
    printf("%d\\n", ret);
  }
}