Problem p00454 (C++) — buggy submission, verdict: Runtime Error

// Bokan ga bokka--nn!!
// Daily Lunch Special Tanoshii !!
// これは、頭が悪く競プロが世界で一番できないHIR180が
// IOI2014日本代表になるまでのN日間の記録である。
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#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++)
int x1[1005], x2[1005], y11[1005], y2[1005];
bool ok[4005][4005] = {};
int main() {
  srand((unsigned int)time(NULL));
  while (1) {

    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    if (!n)
      return 0;
    vector<int> x(0), y(0);
    x.pb(0);
    y.pb(0);
    x.pb(n - 1);
    y.pb(m - 1);
    for (int i = 0; i < k; i++) {
      scanf("%d%d%d%d", &x1[i], &y11[i], &x2[i], &y2[i]);
      if (x1[i])
        x.pb(x1[i] - 1);
      if (x1[i] < n)
        x.pb(x1[i]);
      if (x2[i])
        x.pb(x2[i] - 1);
      if (x2[i] < n)
        x.pb(x2[i]);
      if (y11[i])
        y.pb(y11[i] - 1);
      if (y11[i] < m)
        y.pb(y11[i]);
      if (y2[i])
        y.pb(y2[i] - 1);
      if (y2[i] < m)
        y.pb(y2[i]);
    }
    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());
    memset(ok, 0, sizeof(ok));
    for (int i = 0; i < k; i++) {
      int minx = lower_bound(x.begin(), x.end(), x1[i]) - x.begin();
      int maxx = lower_bound(x.begin(), x.end(), x2[i] - 1) - x.begin();
      int miny = lower_bound(y.begin(), y.end(), y11[i]) - y.begin();
      int maxy = lower_bound(y.begin(), y.end(), y2[i] - 1) - y.begin();
      for (int a = minx; a <= maxx; a++) {
        for (int b = miny; b <= maxy; b++) {
          ok[a][b] = true;
        }
      }
    }
    int ret = 0;
    /*for(int i=0;i<x.size();i++)
    {
            for(int j=0;j<y.size();j++)
            {
                    printf("%c",ok[i][j]?'#':'.');
            }
            puts("");
    }*/
    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        if (ok[i][j])
          continue;
        ret++;
        queue<P> que;
        que.push(mp(i, j));
        int dx[4] = {0, 1, 0, -1};
        int dy[4] = {1, 0, -1, 0};
        while (!que.empty()) {
          P p = que.front();
          que.pop();
          int xq = p.f;
          int yq = p.s;
          if (ok[xq][yq])
            continue;
          ok[xq][yq] = true;
          for (int k = 0; k < 4; k++) {
            int nx = xq + dx[k];
            int ny = yq + dy[k];
            if (!(0 <= nx && nx < x.size()))
              continue;
            if (!(0 <= ny && ny < y.size()))
              continue;
            if (ok[nx][ny])
              continue;
            que.push(mp(nx, ny));
          }
        }
      }
    }
    printf("%d\\n", ret);
  }
}

Error: 0

Fixed submission:

// Bokan ga bokka--nn!!
// Daily Lunch Special Tanoshii !!
// これは、頭が悪く競プロが世界で一番できないHIR180が
// IOI2014日本代表になるまでのN日間の記録である。
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#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++)
int x1[1005], x2[1005], y11[1005], y2[1005];
bool ok[4005][4005] = {};
int main() {
  srand((unsigned int)time(NULL));
  while (1) {

    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    if (!n)
      return 0;
    vector<int> x, y;
    x.pb(0);
    y.pb(0);
    x.pb(n - 1);
    y.pb(m - 1);
    for (int i = 0; i < k; i++) {
      scanf("%d%d%d%d", &x1[i], &y11[i], &x2[i], &y2[i]);
      if (x1[i])
        x.pb(x1[i] - 1);
      if (x1[i] < n)
        x.pb(x1[i]);
      if (x2[i])
        x.pb(x2[i] - 1);
      if (x2[i] < n)
        x.pb(x2[i]);
      if (y11[i])
        y.pb(y11[i] - 1);
      if (y11[i] < m)
        y.pb(y11[i]);
      if (y2[i])
        y.pb(y2[i] - 1);
      if (y2[i] < m)
        y.pb(y2[i]);
    }
    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());
    memset(ok, 0, sizeof(ok));
    for (int i = 0; i < k; i++) {
      int minx = lower_bound(x.begin(), x.end(), x1[i]) - x.begin();
      int maxx = lower_bound(x.begin(), x.end(), x2[i] - 1) - x.begin();
      int miny = lower_bound(y.begin(), y.end(), y11[i]) - y.begin();
      int maxy = lower_bound(y.begin(), y.end(), y2[i] - 1) - y.begin();
      for (int a = minx; a <= maxx; a++) {
        for (int b = miny; b <= maxy; b++) {
          ok[a][b] = true;
        }
      }
    }
    int ret = 0;
    /*for(int i=0;i<x.size();i++)
    {
            for(int j=0;j<y.size();j++)
            {
                    printf("%c",ok[i][j]?'#':'.');
            }
            puts("");
    }*/
    for (int i = 0; i < x.size(); i++) {
      for (int j = 0; j < y.size(); j++) {
        if (ok[i][j])
          continue;
        ret++;
        queue<P> que;
        que.push(mp(i, j));
        int dx[4] = {0, 1, 0, -1};
        int dy[4] = {1, 0, -1, 0};
        while (!que.empty()) {
          P p = que.front();
          que.pop();
          int xq = p.f;
          int yq = p.s;
          ok[xq][yq] = true;
          for (int k = 0; k < 4; k++) {
            int nx = xq + dx[k];
            int ny = yq + dy[k];
            if (!(0 <= nx && nx < x.size()))
              continue;
            if (!(0 <= ny && ny < y.size()))
              continue;
            if (ok[nx][ny])
              continue;
            que.push(mp(nx, ny));
          }
        }
      }
    }
    printf("%d\\n", ret);
  }
}