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

#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <vector>

using namespace std;
int caves[1003][1003] = {};
int dp[1003][1003] = {};
bool flag[1003][1003] = {};
int dp2[1003][1003] = {};

void solve(int m, int n, set<int> prime) {
  for (int i = 0; i < 1003; i++) {
    for (int j = 0; j < 1003; j++) {
      caves[i][j] = 0;
      dp[i][j] = 0;
      flag[i][j] = 0;
      dp2[i][j] = 0;
    }
  }
  caves[500][500] = 1;
  int now_tate = 500;
  int now_yoko = 500;
  int x = 1;
  bool breakflag = 0;
  int ans_tate, ans_yoko;
  if (n == 1) {
    ans_tate = 500;
    ans_yoko = 500;
  }
  for (int i = 1; i < 10000; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < i; k++) {
        x += 1;
        if (x > m) {
          breakflag = 1;
          break;
        }
        if (i % 2 == 1) {
          if (j == 0) {
            now_yoko += 1;
            caves[now_tate][now_yoko] = x;
          } else {
            now_tate -= 1;
            caves[now_tate][now_yoko] = x;
          }
        } else {
          if (j == 0) {
            now_yoko -= 1;
            caves[now_tate][now_yoko] = x;
          } else {
            now_tate += 1;
            caves[now_tate][now_yoko] = x;
          }
        }
        if (x == n) {
          ans_tate = now_tate;
          ans_yoko = now_yoko;
        }
      }
    }
    if (breakflag == 1)
      break;
  }
  for (int i = 0; i < 1003; i++) {
    for (int j = 0; j < 1003; j++) {
      if (prime.count(caves[i][j])) {
        flag[i][j] = 1;
      }
    }
  }
  for (int i = 1001; i >= 0; i--) {
    for (int j = 0; j < 1002; j++) {
      if (i == 1001) {
        if (flag[i][j] == 1) {
          dp[i][j] = 1;
          dp2[i][j] = caves[i][j];
        }
      } else {
        dp[i][j] = dp[i + 1][j];
        if (dp[i][j] != 0) {
          dp2[i][j] = dp2[i + 1][j];
        }
        dp[i][j] = max(dp[i][j], dp[i + 1][j + 1]);
        if (dp[i + 1][j] < dp[i + 1][j + 1]) {
          dp2[i][j] = dp2[i + 1][j + 1];
        }
        if (dp[i + 1][j] == dp[i + 1][j + 1] && dp[i + 1][j] != 0) {
          dp2[i][j] = max(dp2[i + 1][j], dp2[i + 1][j + 1]);
        }
        if (j > 0) {
          if (dp[i][j] < dp[i + 1][j - 1]) {
            dp2[i][j] = dp2[i + 1][j - 1];
          }
          if (dp[i + 1][j - 1] == dp[i][j] && dp[i + 1][j - 1] != 0) {
            dp2[i][j] = max(dp2[i][j], dp2[i + 1][j - 1]);
          }
          dp[i][j] = max(dp[i][j], dp[i + 1][j - 1]);
        }
        if (flag[i][j] == 1) {
          if (dp2[i][j] == 0) {
            dp2[i][j] = caves[i][j];
          }
          dp[i][j] += 1;
        }
      }
    }
  }
  cout << dp[ans_tate][ans_yoko] << " " << dp2[ans_tate][ans_yoko] << endl;
  return;
}

int main() {
  vector<int> vec;
  set<int> prime;
  vec.push_back(2);
  prime.insert(2);
  bool flag1 = 0;
  for (int i = 3; i < 1000000; i++) {
    flag1 = 0;
    for (int j = 0; j < vec.size(); j++) {
      if (i % vec[j] == 0) {
        flag1 = 1;
        break;
      }
      if (vec[j] > sqrt((double)i)) {
        break;
      }
    }
    if (flag1 == 0) {
      vec.push_back(i);
      prime.insert(i);
    }
  }
  int m, n;
  while (1) {
    cin >> m >> n;
    if (m == 0 && n == 0)
      break;
    solve(m, n, prime);
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <vector>

using namespace std;
int caves[1003][1003] = {};
int dp[1003][1003] = {};
bool flag[1003][1003] = {};
int dp2[1003][1003] = {};

void solve(int m, int n, set<int> prime) {
  for (int i = 0; i < 1003; i++) {
    for (int j = 0; j < 1003; j++) {
      caves[i][j] = 0;
      dp[i][j] = 0;
      flag[i][j] = 0;
      dp2[i][j] = 0;
    }
  }
  caves[500][500] = 1;
  int now_tate = 500;
  int now_yoko = 500;
  int x = 1;
  bool breakflag = 0;
  int ans_tate, ans_yoko;
  for (int i = 1; i < 10000; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < i; k++) {
        x += 1;
        if (x > m) {
          breakflag = 1;
          break;
        }
        if (i % 2 == 1) {
          if (j == 0) {
            now_yoko += 1;
            caves[now_tate][now_yoko] = x;
          } else {
            now_tate -= 1;
            caves[now_tate][now_yoko] = x;
          }
        } else {
          if (j == 0) {
            now_yoko -= 1;
            caves[now_tate][now_yoko] = x;
          } else {
            now_tate += 1;
            caves[now_tate][now_yoko] = x;
          }
        }
        if (x == n) {
          ans_tate = now_tate;
          ans_yoko = now_yoko;
        }
      }
    }
    if (breakflag == 1)
      break;
  }
  for (int i = 0; i < 1003; i++) {
    for (int j = 0; j < 1003; j++) {
      if (prime.count(caves[i][j])) {
        flag[i][j] = 1;
      }
    }
  }
  for (int i = 1002; i >= 0; i--) {
    for (int j = 0; j < 1003; j++) {
      if (i == 1002) {
        if (flag[i][j] == 1) {
          dp[i][j] = 1;
          dp2[i][j] = caves[i][j];
        }
      } else {
        dp[i][j] = dp[i + 1][j];
        if (dp[i][j] != 0) {
          dp2[i][j] = dp2[i + 1][j];
        }
        dp[i][j] = max(dp[i][j], dp[i + 1][j + 1]);
        if (dp[i + 1][j] < dp[i + 1][j + 1]) {
          dp2[i][j] = dp2[i + 1][j + 1];
        }
        if (dp[i + 1][j] == dp[i + 1][j + 1] && dp[i + 1][j] != 0) {
          dp2[i][j] = max(dp2[i + 1][j], dp2[i + 1][j + 1]);
        }
        if (j > 0) {
          if (dp[i][j] < dp[i + 1][j - 1]) {
            dp2[i][j] = dp2[i + 1][j - 1];
          }
          if (dp[i + 1][j - 1] == dp[i][j] && dp[i + 1][j - 1] != 0) {
            dp2[i][j] = max(dp2[i][j], dp2[i + 1][j - 1]);
          }
          dp[i][j] = max(dp[i][j], dp[i + 1][j - 1]);
        }
        if (flag[i][j] == 1) {
          if (dp2[i][j] == 0) {
            dp2[i][j] = caves[i][j];
          }
          dp[i][j] += 1;
        }
      }
    }
  }
  cout << dp[ans_tate][ans_yoko] << " " << dp2[ans_tate][ans_yoko] << endl;
  return;
}

int main() {
  vector<int> vec;
  set<int> prime;
  vec.push_back(2);
  prime.insert(2);
  bool flag1 = 0;
  for (int i = 3; i < 1000000; i++) {
    flag1 = 0;
    for (int j = 0; j < vec.size(); j++) {
      if (i % vec[j] == 0) {
        flag1 = 1;
        break;
      }
      if (vec[j] > sqrt((double)i)) {
        break;
      }
    }
    if (flag1 == 0) {
      vec.push_back(i);
      prime.insert(i);
    }
  }
  int m, n;
  while (1) {
    cin >> m >> n;
    if (m == 0 && n == 0)
      break;
    solve(m, n, prime);
  }
  return 0;
}