Problem p02670 (C++)

Buggy submission (status: Runtime Error):
/*
读题不规范，爆零两行泪。
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define X first
#define Y second
const int N = 500;
int n;
bool hav[N + 1][N + 1];
int ans[N + 1][N + 1];
pair<int, int> q[N * N + 1];
int head, tail;
const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int main() {
  cin >> n;
  int anss = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      ans[i][j] = min(min(i, n - i + 1), min(j, n - j + 1)), hav[i][j] = true;
  //	for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)cout<<ans[j][k]<<"
  //";puts("");} 	puts("------------------------------------------------------");
  for (int i = 1; i <= n * n; i++) {
    int ord;
    cin >> ord;
    int x = (ord + n - 1) / n, y = (ord - 1) % n + 1;
    ans[x][y]--;
    hav[x][y] = false;
    anss += ans[x][y];
    head = tail;
    q[tail++] = mp(x, y);
    while (head < tail) {
      int xx = q[head].X, yy = q[head].Y;
      head++;
      for (int j = 0; j < 4; j++) {
        int xxx = xx + dx[j], yyy = yy + dy[j];
        if (1 <= xxx && xxx <= n && 1 <= yyy && yyy <= n &&
            ans[xx][yy] + hav[xxx][yyy] < ans[xxx][yyy])
          ans[xxx][yyy] = ans[xx][yy] + hav[xxx][yyy], q[tail++] = mp(xxx, yyy);
      }
    }
    //		for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)cout<<ans[j][k]<<"
    //";puts("");}
    //		puts("------------------------------------------------------");
  }
  cout << anss;
  return 0;
}

Fixed submission:
/*
读题不规范，爆零两行泪。
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define X first
#define Y second
const int N = 500;
int n;
bool hav[N + 1][N + 1];
int ans[N + 1][N + 1];
pair<int, int> q[N * N + 1];
int head, tail;
const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int main() {
  cin >> n;
  int anss = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      ans[i][j] = min(min(i, n - i + 1), min(j, n - j + 1)), hav[i][j] = true;
  //	for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)cout<<ans[j][k]<<"
  //";puts("");} 	puts("------------------------------------------------------");
  for (int i = 1; i <= n * n; i++) {
    int ord;
    cin >> ord;
    int x = (ord + n - 1) / n, y = (ord - 1) % n + 1;
    ans[x][y]--;
    hav[x][y] = false;
    anss += ans[x][y];
    head = tail = 0;
    q[tail++] = mp(x, y);
    while (head < tail) {
      int xx = q[head].X, yy = q[head].Y;
      head++;
      for (int j = 0; j < 4; j++) {
        int xxx = xx + dx[j], yyy = yy + dy[j];
        if (1 <= xxx && xxx <= n && 1 <= yyy && yyy <= n &&
            ans[xx][yy] + hav[xxx][yyy] < ans[xxx][yyy])
          ans[xxx][yyy] = ans[xx][yy] + hav[xxx][yyy], q[tail++] = mp(xxx, yyy);
      }
    }
    //		for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)cout<<ans[j][k]<<"
    //";puts("");}
    //		puts("------------------------------------------------------");
  }
  cout << anss;
  return 0;
}