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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <sstream>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>
#define REP(i, n) for (int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
typedef vector<ll> vl;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef vector<string> vs;

int n, m;

bool end(int game[][7][7], int value) {
  bool win(false);
  int x[13] = {0, 0, 1, 1, 1, 0, -1, -1, 0, 1, 1, -1, 1};
  int y[13] = {0, 1, 0, 1, 0, 1, 1, 0, -1, 1, -1, 1, 1};
  int z[13] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, -1};
  REP(i, n) {
    REP(j, n) {
      REP(k, n) {
        REP(l, 13) {
          bool flag(true);
          REP(p, m) {
            if (-1 < i + p * x[l] && i + p * x[l] < n && -1 < j + p * y[l] &&
                j + p * y[l] < n && -1 < k + p * z[l] && k + p * z[l] < n) {
              if (game[i + p * x[l]][j + p * y[l]][k + p * z[l]] != value) {
                flag = false;
                break;
              }
            } else {
              flag = false;
            }
          }
          if (flag) {
            win = true;
          }
        }
        if (win)
          break;
      }
      if (win)
        break;
    }
    if (win)
      break;
  }
  if (win) {
    return true;
  } else {
    return false;
  }
}

int main() {
  int q;
  while (scanf("%d%d%d", &n, &m, &q) && n && m && q) {
    int z[7][7] = {}; // z座標に入っている数
    int game[7][7][7] = {};
    bool black(false), white(false);
    int finish(0);
    for (int i = 0; i < q; i++) {
      int a, b;
      if (!black && !white) // 勝敗が決まっていないなら、i+1個目のballを追加
      {
        scanf("%d%d", &a, &b);
        --a;
        --b;
        if (i % 2 == 0) // add black
        {
          game[a][b][z[a][b]] = 1; // 1 means black
          z[a][b]++;
          if (end(game, 1)) {
            black = true;
          }
        } else // add white
        {
          game[a][b][z[a][b]] = 2; // 2 means white
          z[a][b]++;
          if (end(game, 2)) {
            white = true;
          }
        }
        finish++;
      } else // 勝敗が決まっている
      {
        scanf("%d%d", &a, &b);
      }
    }

    if (!black && white) {
      printf("White %d\\n", finish);
    } else if (black && !white) {
      printf("Black %d\\n", finish);
    } else {
      printf("Draw\\n");
    }
  }
  return 0;
}

Error: WA

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <sstream>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>
#define REP(i, n) for (int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
typedef vector<ll> vl;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef vector<string> vs;

int n, m;

bool end(int game[][7][7], int value) {
  bool win(false);
  int x[13] = {0, 0, 1, 1, 1, 0, -1, -1, 0, 1, 1, -1, 1};
  int y[13] = {0, 1, 0, 1, 0, 1, 1, 0, -1, 1, -1, 1, 1};
  int z[13] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, -1};
  REP(i, n) {
    REP(j, n) {
      REP(k, n) {
        REP(l, 11) {
          bool flag(true);
          REP(p, m) {
            if (-1 < i + p * x[l] && i + p * x[l] < n && -1 < j + p * y[l] &&
                j + p * y[l] < n && -1 < k + p * z[l] && k + p * z[l] < n) {
              if (game[i + p * x[l]][j + p * y[l]][k + p * z[l]] != value) {
                flag = false;
                break;
              }
            } else {
              flag = false;
            }
          }
          if (flag) {
            win = true;
          }
        }
        if (win)
          break;
      }
      if (win)
        break;
    }
    if (win)
      break;
  }
  if (win) {
    return true;
  } else {
    return false;
  }
}

int main() {
  int q;
  while (scanf("%d%d%d", &n, &m, &q) && n && m && q) {
    int z[7][7] = {}; // z座標に入っている数
    int game[7][7][7] = {};
    bool black(false), white(false);
    int finish(0);
    for (int i = 0; i < q; i++) {
      int a, b;
      if (!black && !white) // 勝敗が決まっていないなら、i+1個目のballを追加
      {
        scanf("%d%d", &a, &b);
        if (i % 2 == 0) // add black
        {
          game[a][b][z[a][b]] = 1; // 1 means black
          z[a][b]++;
          if (end(game, 1)) {
            black = true;
          }
        } else // add white
        {
          game[a][b][z[a][b]] = 2; // 2 means white
          z[a][b]++;
          if (end(game, 2)) {
            white = true;
          }
        }
        finish++;
      } else // 勝敗が決まっている
      {
        scanf("%d%d", &a, &b);
      }
    }

    if (!black && white) {
      printf("White %d\\n", finish);
    } else if (black && !white) {
      printf("Black %d\\n", finish);
    } else {
      printf("Draw\\n");
    }
  }
  return 0;
}