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

#include <algorithm>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; ++i)
#define pii pair<int, int>

#define MAXM 1000001
#define MAXSQM 1003
int diff[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int map[MAXSQM][MAXSQM] = {};
bool furui[MAXM] = {};
pii dpmap[MAXSQM][2] = {};

void init_map(int m) {
  fill_n(*map, MAXSQM * MAXSQM, 0);
  fill_n(*dpmap, MAXSQM * 2, pii(-1, -1));
  int idx = MAXSQM / 2, idy = MAXSQM / 2;
  int dir = 0;
  int c = 1;
  for (int i = 1; c <= m; i++) {
    for (int j = 0; j < i && c <= m; j++) {
      map[idx][idy] = c++;
      idx += diff[dir][0];
      idy += diff[dir][1];
    }
    dir = (dir + 1) % 4;
    for (int j = 0; j < i && c <= m; j++) {
      map[idx][idy] = c++;
      idx += diff[dir][0];
      idy += diff[dir][1];
    }
    dir = (dir + 1) % 4;
  }
}

pii dp(int n) {
  int nx, ny;
  for (nx = 0; nx < MAXSQM; nx++) {
    for (ny = 0; ny < MAXSQM; ny++) {
      if (n == map[nx][ny])
        break;
    }
    if (n == map[nx][ny])
      break;
  }

  pii ans = pii(0, 0);

  if (!furui[map[nx][ny]]) {
    dpmap[nx][ny % 2] = pii(1, map[nx][ny]);
    ans = dpmap[nx][ny % 2];
  } else {
    dpmap[nx][ny % 2] = pii(0, 0);
  }

  for (int j = ny; j >= 1; j--) {
    for (int i = 0; i < MAXSQM; i++) {
      if (map[i][j] == 0 || dpmap[i][j % 2].first == -1)
        continue;
      for (int k = -1; k <= 1; k++) {
        if (map[i + k][j - 1] == 0)
          continue;
        if (!furui[map[i + k][j - 1]]) {
          dpmap[i + k][(j - 1) % 2] =
              max(pii(dpmap[i][j % 2].first + 1, map[i + k][j - 1]),
                  dpmap[i + k][(j - 1) % 2]);
        } else {
          dpmap[i + k][(j - 1) % 2] =
              max(dpmap[i][j % 2], dpmap[i + k][(j - 1) % 2]);
        }
        ans = max(ans, dpmap[i + k][(j - 1) % 2]);
      }
    }
  }
  return ans;
}

int main() {
  while (1) {
    int m, n;
    cin >> m >> n;
    if (m == 0)
      break;

    furui[0] = furui[1] = true;
    for (int i = 2; i < MAXSQM; i++) {
      for (int j = 2; i * j < MAXM; j++) {
        if (!furui[i]) {
          furui[i * j] = true;
        }
      }
    }
    init_map(m);
    pii p = dp(n);

    /*int b=MAXSQM/2,a=MAXSQM/2;
    for(int i=a-5;i<a+5;i++){
        for(int j=b-5;j<b+5;j++){
            cout<<std::setw(4)<<map[j][i];
        }
        cout<<endl;
    }
    for(int i=a-5;i<a+5;i++){
        for(int j=b-5;j<b+5;j++){
            cout<<setw(4)<<dpmap[j][i].first;
        }
        cout<<endl;
    }*/
    cout << p.first << " " << p.second << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; ++i)
#define pii pair<int, int>

#define MAXM 1000001
#define MAXSQM 1002
int diff[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int map[MAXSQM][MAXSQM] = {};
bool furui[MAXM] = {};
pii dpmap[MAXSQM][2] = {};

void init_map(int m) {
  fill_n(*map, MAXSQM * MAXSQM, 0);
  fill_n(*dpmap, MAXSQM * 2, pii(-1, -1));
  int idx = MAXSQM / 2, idy = MAXSQM / 2;
  int dir = 0;
  int c = 1;
  for (int i = 1; c <= m; i++) {
    for (int j = 0; j < i && c <= m; j++) {
      map[idx][idy] = c++;
      idx += diff[dir][0];
      idy += diff[dir][1];
    }
    dir = (dir + 1) % 4;
    for (int j = 0; j < i && c <= m; j++) {
      map[idx][idy] = c++;
      idx += diff[dir][0];
      idy += diff[dir][1];
    }
    dir = (dir + 1) % 4;
  }
}

pii dp(int n) {
  int nx, ny;
  for (nx = 0; nx < MAXSQM; nx++) {
    for (ny = 0; ny < MAXSQM; ny++) {
      if (n == map[nx][ny])
        break;
    }
    if (n == map[nx][ny])
      break;
  }

  pii ans = pii(0, 0);

  if (!furui[map[nx][ny]]) {
    dpmap[nx][ny % 2] = pii(1, map[nx][ny]);
    ans = dpmap[nx][ny % 2];
  } else {
    dpmap[nx][ny % 2] = pii(0, 0);
  }

  for (int j = ny; j >= 1; j--) {
    for (int i = 0; i < MAXSQM; i++) {
      if (map[i][j] == 0 || dpmap[i][j % 2].first == -1)
        continue;
      for (int k = -1; k <= 1; k++) {
        if (map[i + k][j - 1] == 0)
          continue;
        if (!furui[map[i + k][j - 1]]) {
          dpmap[i + k][(j - 1) % 2] =
              max(pii(dpmap[i][j % 2].first + 1, map[i + k][j - 1]),
                  dpmap[i + k][(j - 1) % 2]);
        } else {
          dpmap[i + k][(j - 1) % 2] =
              max(dpmap[i][j % 2], dpmap[i + k][(j - 1) % 2]);
        }
        ans = max(ans, dpmap[i + k][(j - 1) % 2]);
      }
    }
  }
  return ans;
}

int main() {
  while (1) {
    int m, n;
    cin >> m >> n;
    if (m == 0)
      break;

    furui[0] == furui[1] == true;
    for (int i = 2; i < MAXSQM; i++) {
      for (int j = 2; i * j < MAXM; j++) {
        if (!furui[i]) {
          furui[i * j] = true;
        }
      }
    }
    init_map(m);
    pii p = dp(n);

    /*int b=503,a=487;
    for(int i=a-5;i<a+5;i++){
        for(int j=b-5;j<b+5;j++){
            cout<<std::setw(4)<<map[j][i];
        }
        cout<<endl;
    }
    for(int i=a-5;i<a+5;i++){
        for(int j=b-5;j<b+5;j++){
            cout<<setw(4)<<dpmap[j][i].first;
        }
        cout<<endl;
    }*/
    cout << p.first << " " << p.second << endl;
  }
  return 0;
}