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

#include <algorithm>
#include <functional>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <vector>

#define maxN 1024

using namespace std;

typedef pair<int, int> P;

int a[maxN * 3][maxN * 3];
int x1[maxN], x2[maxN], y1[maxN], y2[maxN];
int w, h, n, dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

int compress(int *X1, int *X2, int W) {
  int i, j, tx1, tx2;
  vector<int> xs;
  for (i = 0; i < n; i++) {
    tx1 = X1[i];
    tx2 = X2[i];
    if (1 <= tx1 && tx1 <= W)
      xs.push_back(tx1);
    if (1 <= tx2 && tx2 <= W)
      xs.push_back(tx2);
  }
  xs.push_back(0);
  xs.push_back(w);
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (i = 0; i < n; i++) {
    X1[i] = find(xs.begin(), xs.end(), X1[i]) - xs.begin();
    X2[i] = find(xs.begin(), xs.end(), X2[i]) - xs.begin();
  }
  return xs.size() - 1;
}

int main() {
  int i, j, y, x;
  while (scanf("%d %d", &w, &h) && (w || h)) {
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
      scanf("%d %d %d %d", &x1[i], &y1[i], &x2[i], &y2[i]);
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    memset(a, 0, sizeof(a));
    for (i = 0; i < n; i++) {
      a[y1[i]][x1[i]]++;
      a[y1[i]][x2[i]]--;
      a[y2[i]][x1[i]]--;
      a[y2[i]][x2[i]]++;
    }
    for (i = 0; i < h; i++) {
      for (j = 1; j < w; j++) {
        a[i][j] += a[i][j - 1];
      }
    }
    for (i = 1; i < h; i++) {
      for (j = 0; j < w; j++) {
        a[i][j] += a[i - 1][j];
      }
    }
    int ans = 0;
    for (y = 0; y < h; y++) {
      for (x = 0; x < w; x++) {
        if (a[y][x])
          continue;
        ans++;
        queue<P> que;
        que.push(P(x, y));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();
          for (i = 0; i < 4; i++) {
            int tx = sx + dir[i][0], ty = sy + dir[i][1];
            if (tx >= 0 && tx < w && ty >= 0 && ty < h && a[ty][tx] == 0) {
              que.push(P(tx, ty));
              a[ty][tx] = 1;
            }
          }
        }
      }
    }
    printf("%d\\n", ans);
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <functional>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <vector>

#define maxN 20

using namespace std;

typedef pair<int, int> P;

int a[maxN * 3][maxN * 3];
int x1[maxN], x2[maxN], y1[maxN], y2[maxN];
int w, h, n, dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

int compress(int *X1, int *X2, int W) {
  int i, j, tx1, tx2;
  vector<int> xs;
  for (i = 0; i < n; i++) {
    tx1 = X1[i];
    tx2 = X2[i];
    if (1 <= tx1 && tx1 <= W)
      xs.push_back(tx1);
    if (1 <= tx2 && tx2 <= W)
      xs.push_back(tx2);
  }
  xs.push_back(0);
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  for (i = 0; i < n; i++) {
    X1[i] = find(xs.begin(), xs.end(), X1[i]) - xs.begin();
    X2[i] = find(xs.begin(), xs.end(), X2[i]) - xs.begin();
  }
  return xs.size() - 1;
}

int main() {
  int i, j, y, x;
  while (scanf("%d %d", &w, &h) && (w || h)) {
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
      scanf("%d %d %d %d", &x1[i], &y1[i], &x2[i], &y2[i]);
    }
    w = compress(x1, x2, w);
    h = compress(y1, y2, h);
    memset(a, 0, sizeof(a));
    for (i = 0; i < n; i++) {
      a[y1[i]][x1[i]]++;
      a[y1[i]][x2[i]]--;
      a[y2[i]][x1[i]]--;
      a[y2[i]][x2[i]]++;
    }
    for (i = 0; i < h; i++) {
      for (j = 1; j < w; j++) {
        a[i][j] += a[i][j - 1];
      }
    }
    for (i = 1; i < h; i++) {
      for (j = 0; j < w; j++) {
        a[i][j] += a[i - 1][j];
      }
    }
    int ans = 0;
    for (y = 0; y < h; y++) {
      for (x = 0; x < w; x++) {
        if (a[y][x])
          continue;
        ans++;
        queue<P> que;
        que.push(P(x, y));
        while (!que.empty()) {
          int sx = que.front().first, sy = que.front().second;
          que.pop();
          for (i = 0; i < 4; i++) {
            int tx = sx + dir[i][0], ty = sy + dir[i][1];
            if (tx >= 0 && tx < w && ty >= 0 && ty < h && a[ty][tx] == 0) {
              que.push(P(tx, ty));
              a[ty][tx] = 1;
            }
          }
        }
      }
    }
    printf("%d\\n", ans);
  }
  return 0;
}