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

#include <algorithm>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define rep(i, n) for (int i = 0; i < n; i++)
#define repa(i, s, e) for (int i = s; i <= e; i++)
#define repd(i, s, e) for (int i = s; i >= e; i--)

typedef long long ll;
typedef vector<int> vi;

int dxo[6] = {-1, 0, -1, 1, -1, 0};
int dxe[6] = {0, 1, -1, 1, 0, 1};
int dy[6] = {-1, -1, 0, 0, 1, 1};

struct node {
  int x, y, dist, num;
};

const int INF = 1000000009;
const int MAX_N = 101;
const int MAX_S = 11;
int n, m, s, t;
int cx[MAX_S], cy[MAX_S], tx[MAX_S], ty[MAX_S];
int field[MAX_N][MAX_N];
int dist[MAX_N][MAX_N];
char used[MAX_N][MAX_N];

int bfs(int x, int y) {
  rep(j, n) rep(i, m) used[i][j] = 0;

  int res = 0;
  queue<node> que;
  node md = {x, y, 0, -1};
  used[x][y] = 1;
  que.push(md);
  while (!que.empty()) {
    node nd = que.front();
    que.pop();

    if (dist[nd.x][nd.y] <= nd.dist)
      continue;

    used[nd.x][nd.y] = 1;
    res++;
    rep(k, 6) {
      int xx = (nd.y % 2 == 0) ? nd.x + dxo[k] : nd.x + dxe[k];
      int yy = nd.y + dy[k];
      if (xx >= 0 && yy >= 0 && xx < m && yy < n && used[xx][yy] == 0 &&
          dist[xx][yy] > nd.dist + 1) {
        node nnd = {xx, yy, nd.dist + 1, -1};
        used[xx][yy] = 1;
        que.push(nnd);
      }
    }
  }
  return res;
}

void solve() {
  rep(y, n) {
    rep(x, m) {
      field[x][y] = 0;
      dist[x][y] = INF;
    }
  }

  queue<node> que;
  rep(i, s) {
    node nd = {cx[i] - 1, cy[i] - 1, 0, i + 1};
    que.push(nd);
  }

  while (!que.empty()) {
    node nd = que.front();
    que.pop();

    if (dist[nd.x][nd.y] > nd.dist) {
      dist[nd.x][nd.y] = nd.dist;
      field[nd.x][nd.y] = nd.num;
    } else if (dist[nd.x][nd.y] == nd.dist && field[nd.x][nd.y] != nd.num &&
               field[nd.x][nd.y] != 0) {
      field[nd.x][nd.y] = 0;
    } else {
      continue;
    }

    rep(k, 6) {
      int xx = (nd.y % 2 == 0) ? nd.x + dxo[k] : nd.x + dxe[k];
      int yy = nd.y + dy[k];
      if (xx >= 0 && yy >= 0 && xx < m && yy < n) {
        node nnd = {xx, yy, nd.dist + 1, nd.num};
        que.push(nnd);
      }
    }
  }

  int maxval = 0;
  rep(i, t) {
    int res = bfs(tx[i] - 1, ty[i] - 1);
    maxval = max(res, maxval);
  }
  printf("%d\\n", maxval);
}

int main() {
  for (;;) {
    scanf("%d", &m);
    if (m == 0)
      break;

    scanf("%d", &n);
    scanf("%d", &s);
    rep(i, s) scanf("%d%d", &cx[i], &cy[i]);

    scanf("%d", &t);
    rep(i, t) scanf("%d%d", &tx[i], &ty[i]);

    solve();
  }
}

Error: 0

Fixed submission:

#include <algorithm>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define rep(i, n) for (int i = 0; i < n; i++)
#define repa(i, s, e) for (int i = s; i <= e; i++)
#define repd(i, s, e) for (int i = s; i >= e; i--)

typedef long long ll;
typedef vector<int> vi;

int dxo[6] = {-1, 0, -1, 1, -1, 0};
int dxe[6] = {0, 1, -1, 1, 0, 1};
int dy[6] = {-1, -1, 0, 0, 1, 1};

struct node {
  int x, y, dist, num;
};

const int INF = 1000000009;
const int MAX_N = 101;
const int MAX_S = 11;
int n, m, s, t;
int cx[MAX_S], cy[MAX_S], tx[MAX_S], ty[MAX_S];
int field[MAX_N][MAX_N];
int dist[MAX_N][MAX_N];
char used[MAX_N][MAX_N];

int bfs(int x, int y) {
  rep(j, n) rep(i, m) used[i][j] = 0;

  int res = 0;
  queue<node> que;
  node md = {x, y, 0, -1};
  que.push(md);
  while (!que.empty()) {
    node nd = que.front();
    que.pop();

    if (dist[nd.x][nd.y] <= nd.dist)
      continue;

    used[nd.x][nd.y] = 1;
    res++;
    rep(k, 6) {
      int xx = (nd.y % 2 == 0) ? nd.x + dxo[k] : nd.x + dxe[k];
      int yy = nd.y + dy[k];
      if (xx >= 0 && yy >= 0 && xx < m && yy < n && used[xx][yy] == 0) {
        node nnd = {xx, yy, nd.dist + 1, -1};
        que.push(nnd);
      }
    }
  }
  return res;
}

void solve() {
  rep(y, n) {
    rep(x, m) {
      field[x][y] = 0;
      dist[x][y] = INF;
    }
  }

  queue<node> que;
  rep(i, s) {
    node nd = {cx[i] - 1, cy[i] - 1, 0, i + 1};
    field[cx[i] - 1][cy[i] - 1] = i + 1;
    dist[cx[i] - 1][cy[i] - 1] = 0;
    que.push(nd);
  }

  while (!que.empty()) {
    node nd = que.front();
    que.pop();

    rep(k, 6) {
      int xx = (nd.y % 2 == 0) ? nd.x + dxo[k] : nd.x + dxe[k];
      int yy = nd.y + dy[k];
      if (xx >= 0 && yy >= 0 && xx < m && yy < n) {
        if (dist[xx][yy] > nd.dist + 1) {
          dist[xx][yy] = nd.dist + 1;
          field[xx][yy] = nd.num;
        } else if (dist[xx][yy] == nd.dist + 1 && field[xx][yy] != nd.num) {
          field[xx][yy] = 0;
        } else {
          continue;
        }

        node nnd = {xx, yy, nd.dist + 1, nd.num};
        que.push(nnd);
      }
    }
  }

  int maxval = 0;
  rep(i, t) {
    int res = bfs(tx[i] - 1, ty[i] - 1);
    maxval = max(res, maxval);
  }
  printf("%d\\n", maxval);
}

int main() {
  for (;;) {
    scanf("%d", &m);
    if (m == 0)
      break;

    scanf("%d", &n);
    scanf("%d", &s);
    rep(i, s) scanf("%d%d", &cx[i], &cy[i]);

    scanf("%d", &t);
    rep(i, t) scanf("%d%d", &tx[i], &ty[i]);

    solve();
  }
}