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

#include <cstdio>
using namespace std;

const int SIZE = 1000;
bool prime[SIZE * SIZE + 1];
int table[SIZE][SIZE];
int dp[SIZE][SIZE];
int pr[SIZE][SIZE];

int main() {
  int m, n;
  int y = 500, x = 499;
  int a = 1;

  prime[0] = true;
  prime[1] = true;
  for (int i = 2; i <= SIZE * SIZE; i++) {
    if (!prime[i]) {
      for (int j = i * 2; j <= SIZE * SIZE; j += i) {
        prime[j] = true;
      }
    }
  }

  table[y][x] = a;
  a++;
  x++;
  for (int i = 1; i < SIZE; i++) {
    for (int j = 0; j < i; j++) {
      table[y][x] = a;
      a++;
      if (i % 2 == 0)
        y++;
      else
        y--;
    }
    for (int j = 0; j < i + 1; j++) {
      table[y][x] = a;
      a++;
      if (i % 2 == 0)
        x++;
      else
        x--;
    }
  }
  while (true) {
    scanf("%d %d", &m, &n);
    if (m == 0 || n == 0)
      return 0;

    for (int i = 0; i < SIZE; i++) {
      for (int j = 0; j < SIZE; j++) {
        dp[i][j] = 0;
        pr[i][j] = 0;
      }
    }

    for (int i = SIZE - 1; i >= 0; i--) {
      for (int j = SIZE - 1; j >= 0; j--) {
        if (table[i][j] <= m) {
          if (i + 1 < SIZE) {
            if (j > 0 && table[i + 1][j - 1] <= m) {
              if (dp[i][j] < dp[i + 1][j - 1] ||
                  (dp[i][j] == dp[i + 1][j - 1] &&
                   pr[i][j] < pr[i + 1][j - 1])) {
                dp[i][j] = dp[i + 1][j - 1];
                pr[i][j] = pr[i + 1][j - 1];
              }
            }
            if (table[i + 1][j] <= m) {
              if (dp[i][j] < dp[i + 1][j] ||
                  (dp[i][j] == dp[i + 1][j] && pr[i][j] < pr[i + 1][j])) {
                dp[i][j] = dp[i + 1][j];
                pr[i][j] = pr[i + 1][j];
              }
            }
            if (j + 1 < SIZE && table[i + 1][j + 1] <= m) {
              if (dp[i][j] < dp[i + 1][j + 1] ||
                  (dp[i][j] == dp[i + 1][j + 1] &&
                   pr[i][j] < pr[i + 1][j + 1])) {
                dp[i][j] = dp[i + 1][j + 1];
                pr[i][j] = pr[i + 1][j + 1];
              }
            }
          }
          if (!prime[table[i][j]]) {
            dp[i][j]++;
            if (pr[i][j] == 0) {
              pr[i][j] = table[i][j];
            }
          }
        }
      }
    }

    for (int i = 0; i < SIZE; i++) {
      for (int j = 0; j < SIZE; j++) {
        if (table[i][j] == n) {
          printf("%d %d\\n", dp[i][j], pr[i][j]);
        }
      }
    }
  }
}

Error: -11

Fixed submission:

#include <cstdio>
using namespace std;

int main() {
  const int SIZE = 1000;
  int m, n;
  bool prime[SIZE * SIZE + 1];
  int table[SIZE][SIZE];
  int dp[SIZE][SIZE];
  int pr[SIZE][SIZE];
  int y = 500, x = 499;
  int a = 1;

  prime[0] = true;
  prime[1] = true;
  for (int i = 2; i <= SIZE * SIZE; i++) {
    if (!prime[i]) {
      for (int j = i * 2; j <= SIZE * SIZE; j += i) {
        prime[j] = true;
      }
    }
  }

  table[y][x] = a;
  a++;
  x++;
  for (int i = 1; i < SIZE; i++) {
    for (int j = 0; j < i; j++) {
      table[y][x] = a;
      a++;
      if (i % 2 == 0)
        y++;
      else
        y--;
    }
    for (int j = 0; j < i + 1; j++) {
      table[y][x] = a;
      a++;
      if (i % 2 == 0)
        x++;
      else
        x--;
    }
  }
  for (int r = 0; r < 1; r++) {
    scanf("%d %d", &m, &n);
    if (m == 0 || n == 0)
      return 0;

    for (int i = 0; i < SIZE; i++) {
      for (int j = 0; j < SIZE; j++) {
        dp[i][j] = 0;
        pr[i][j] = 0;
      }
    }

    for (int i = SIZE - 1; i >= 0; i--) {
      for (int j = SIZE - 1; j >= 0; j--) {
        if (table[i][j] <= m) {
          if (i + 1 < SIZE) {
            if (j > 0 && table[i + 1][j - 1] <= m) {
              if (dp[i][j] < dp[i + 1][j - 1] ||
                  (dp[i][j] == dp[i + 1][j - 1] &&
                   pr[i][j] < pr[i + 1][j - 1])) {
                dp[i][j] = dp[i + 1][j - 1];
                pr[i][j] = pr[i + 1][j - 1];
              }
            }
            if (table[i + 1][j] <= m) {
              if (dp[i][j] < dp[i + 1][j] ||
                  (dp[i][j] == dp[i + 1][j] && pr[i][j] < pr[i + 1][j])) {
                dp[i][j] = dp[i + 1][j];
                pr[i][j] = pr[i + 1][j];
              }
            }
            if (j + 1 < SIZE && table[i + 1][j + 1] <= m) {
              if (dp[i][j] < dp[i + 1][j + 1] ||
                  (dp[i][j] == dp[i + 1][j + 1] &&
                   pr[i][j] < pr[i + 1][j + 1])) {
                dp[i][j] = dp[i + 1][j + 1];
                pr[i][j] = pr[i + 1][j + 1];
              }
            }
          }
          if (!prime[table[i][j]]) {
            dp[i][j]++;
            if (pr[i][j] == 0) {
              pr[i][j] = table[i][j];
            }
          }
        }
      }
    }

    for (int i = 0; i < SIZE; i++) {
      for (int j = 0; j < SIZE; j++) {
        if (table[i][j] == n) {
          printf("%d %d\\n", dp[i][j], pr[i][j]);
        }
      }
    }
  }
}