Problem p00770 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define reps(i, a, n) for (int i = a; i < (n); i++)
#define X first
#define Y second

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, -1, 0, 1};

int a[4000][4000];

const int c = 2000;

bool isp[1234567];

pii p[4000][4000];
int v[4000][4000];

int main() {

  rep(i, 1234567) isp[i] = true;
  isp[0] = isp[1] = false;
  rep(i, 1234567) {
    if (!isp[i])
      continue;
    for (int j = i * 2; j < 1234567; j += i) {
      isp[j] = false;
    }
  }

  for (;;) {
    int n, m;
    cin >> n >> m;
    if (n == 0)
      break;

    rep(i, 4000) rep(j, 4000) a[i][j] = 0;

    a[c][c] = 1;
    if (n > 1)
      a[c][c + 1] = 2;

    int d = 2;
    int x = 1;
    int y = -1;
    reps(i, 3, n + 1) {
      a[c + y][c + x] = i;
      int X = x;
      int Y = y;
      X += dx[(d + 1) % 4];
      Y += dy[(d + 1) % 4];
      if (a[c + Y][c + X] == 0) {
        d++;
        d %= 4;
      }
      x += dx[d];
      y += dy[d];
    }
    /*
                    reps(i, -10, 11){
                            reps(j, -10, 11){
                                    printf("%3d", a[c+i][c+j]);
                            }
                            puts("");
                    }puts("");
    */
    rep(i, 4000) rep(j, 4000) {
      v[i][j] = -4000;
      if (a[i][j] == m)
        v[i][j] = 0;
    }
    /*
                    reps(i, -10, 11){
                            reps(j, -10, 11){
                                    printf("%6d", v[c+i][c+j]);
                            }
                            puts("");
                    }puts("");
                    */
    int ma = -1;
    int mi = 0;
    reps(i, 1, 3999) reps(j, 1, 3999) {
      int A = v[i - 1][j - 1];
      int B = v[i - 1][j];
      int C = v[i - 1][j + 1];

      v[i][j] = max(max(max(A, B), C), v[i][j]) + isp[a[i][j]];

      if (ma <= v[i][j]) {
        if (ma != v[i][j]) {
          ma = v[i][j];
          mi = 0;
        }
        if (isp[a[i][j]])
          mi = max(mi, a[i][j]);
      }
    }
    cout << ma << " " << mi << endl;
  }

  return 0;
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define reps(i, a, n) for (int i = a; i < (n); i++)
#define X first
#define Y second

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, -1, 0, 1};

int a[5000][5000];

const int c = 2000;

bool isp[1234567];

pii p[5000][5000];
int v[5000][5000];

int main() {

  rep(i, 1234567) isp[i] = true;
  isp[0] = isp[1] = false;
  rep(i, 1234567) {
    if (!isp[i])
      continue;
    for (int j = i * 2; j < 1234567; j += i) {
      isp[j] = false;
    }
  }

  for (;;) {
    int n, m;
    cin >> n >> m;
    if (n == 0)
      break;

    rep(i, 5000) rep(j, 5000) a[i][j] = 0;

    a[c][c] = 1;
    if (m > 1)
      a[c][c + 1] = 2;

    int d = 2;
    int x = 1;
    int y = -1;
    reps(i, 3, n + 1) {
      a[c + y][c + x] = i;
      int X = x;
      int Y = y;
      X += dx[(d + 1) % 4];
      Y += dy[(d + 1) % 4];
      if (a[c + Y][c + X] == 0) {
        d++;
        d %= 4;
      }
      x += dx[d];
      y += dy[d];
    }
    /*
                    reps(i, -10, 11){
                            reps(j, -10, 11){
                                    printf("%3d", a[c+i][c+j]);
                            }
                            puts("");
                    }puts("");
    */
    rep(i, 5000) rep(j, 5000) {
      v[i][j] = -5000;
      if (a[i][j] == m)
        v[i][j] = 0;
    }

    int ma = -1;
    int mi = 0;
    reps(i, 1, 4999) reps(j, 1, 4999) {
      int A = v[i - 1][j - 1];
      int B = v[i - 1][j];
      int C = v[i - 1][j + 1];

      v[i][j] = max(max(max(A, B), C), v[i][j]) + isp[a[i][j]];

      if (ma <= v[i][j]) {
        if (ma != v[i][j]) {
          ma = v[i][j];
          mi = 0;
        }
        if (isp[a[i][j]])
          mi = max(mi, a[i][j]);
      }
    }
    cout << ma << " " << mi << endl;
  }

  return 0;
}