Problem p02579 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) ll(x.size())      // sizeをsize_tからllに直しておく
#define LEN(x) ll(x.length())     // lengthをsize_tからllに直しておく
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB emplace_back // vectorヘの挿入
#define MP make_pair    // pairのコンストラクタ
#define F first         // pairの一つ目の要素
#define S second        // pairの二つ目の要素
#define Umap unordered_map
#define Uset unordered_set

bool is_ok(ll a, ll b, ll h, ll w) {
  if (a < 0)
    return false;
  if (a >= h)
    return false;
  if (b < 0)
    return false;
  if (b >= w)
    return false;
  return true;
}

int main() {
  ll h, w, ch, cw, dh, dw;
  cin >> h >> w;
  cin >> ch >> cw;
  cin >> dh >> dw;
  vector<string> s(h);
  REP(i, h) cin >> s[i];
  queue<pair<ll, ll>> q, temp, next;
  vector<vector<ll>> num(h, vector<ll>(w, -1));
  ch--;
  cw--;
  dh--;
  dw--;
  q.emplace(ch, cw);
  temp.emplace(ch, cw);
  num[ch][cw] = 0;
  while (!temp.empty()) {
    while (!q.empty()) {
      auto v = q.front();
      q.pop();
      if (v.F == dh && v.S == dw) {
        cout << num[v.F][v.S];
        return true;
      }
      if (is_ok(v.F - 1, v.S, h, w)) {
        if (s[v.F - 1][v.S] == '.' && num[v.F - 1][v.S] == -1) {
          q.emplace(v.F - 1, v.S);
          temp.emplace(v.F - 1, v.S);
          num[v.F - 1][v.S] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F + 1, v.S, h, w)) {
        if (s[v.F + 1][v.S] == '.' && num[v.F + 1][v.S] == -1) {
          q.emplace(v.F + 1, v.S);
          temp.emplace(v.F + 1, v.S);
          num[v.F + 1][v.S] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F, v.S - 1, h, w)) {
        if (s[v.F][v.S - 1] == '.' && num[v.F][v.S - 1] == -1) {
          q.emplace(v.F, v.S - 1);
          temp.emplace(v.F, v.S - 1);
          num[v.F][v.S - 1] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F, v.S + 1, h, w)) {
        if (s[v.F][v.S + 1] == '.' && num[v.F][v.S + 1] == -1) {
          q.emplace(v.F, v.S + 1);
          temp.emplace(v.F, v.S + 1);
          num[v.F][v.S + 1] = num[v.F][v.S];
        }
      }
    }
    while (!temp.empty()) {
      auto v = temp.front();
      temp.pop();
      for (ll i = -2; i <= 2; i++) {
        for (ll j = -2; j <= 2; j++) {
          if (is_ok(v.F + i, v.S + j, h, w)) {
            if (s[v.F + i][v.S + j] == '.' && num[v.F + i][v.S + j] == -1) {
              q.emplace(v.F + i, v.S + j);
              next.emplace(v.F + i, v.S + j);
              num[v.F + i][v.S + j] = num[v.F][v.S] + 1;
            }
          }
        }
      }
    }
    // next -> temp
    while (!next.empty()) {
      auto v = next.front();
      next.pop();
      temp.emplace(v);
    }
  }
  cout << -1;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end() // sortなどの引数を省略したい
#define SIZE(x) ll(x.size())      // sizeをsize_tからllに直しておく
#define LEN(x) ll(x.length())     // lengthをsize_tからllに直しておく
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB emplace_back // vectorヘの挿入
#define MP make_pair    // pairのコンストラクタ
#define F first         // pairの一つ目の要素
#define S second        // pairの二つ目の要素
#define Umap unordered_map
#define Uset unordered_set

bool is_ok(ll a, ll b, ll h, ll w) {
  if (a < 0)
    return false;
  if (a >= h)
    return false;
  if (b < 0)
    return false;
  if (b >= w)
    return false;
  return true;
}

int main() {
  ll h, w, ch, cw, dh, dw;
  cin >> h >> w;
  cin >> ch >> cw;
  cin >> dh >> dw;
  vector<string> s(h);
  REP(i, h) cin >> s[i];
  queue<pair<ll, ll>> q, temp, next;
  vector<vector<ll>> num(h, vector<ll>(w, -1));
  ch--;
  cw--;
  dh--;
  dw--;
  q.emplace(ch, cw);
  temp.emplace(ch, cw);
  num[ch][cw] = 0;
  while (!temp.empty()) {
    while (!q.empty()) {
      auto v = q.front();
      q.pop();
      if (v.F == dh && v.S == dw) {
        cout << num[v.F][v.S];
        return 0;
      }
      if (is_ok(v.F - 1, v.S, h, w)) {
        if (s[v.F - 1][v.S] == '.' && num[v.F - 1][v.S] == -1) {
          q.emplace(v.F - 1, v.S);
          temp.emplace(v.F - 1, v.S);
          num[v.F - 1][v.S] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F + 1, v.S, h, w)) {
        if (s[v.F + 1][v.S] == '.' && num[v.F + 1][v.S] == -1) {
          q.emplace(v.F + 1, v.S);
          temp.emplace(v.F + 1, v.S);
          num[v.F + 1][v.S] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F, v.S - 1, h, w)) {
        if (s[v.F][v.S - 1] == '.' && num[v.F][v.S - 1] == -1) {
          q.emplace(v.F, v.S - 1);
          temp.emplace(v.F, v.S - 1);
          num[v.F][v.S - 1] = num[v.F][v.S];
        }
      }
      if (is_ok(v.F, v.S + 1, h, w)) {
        if (s[v.F][v.S + 1] == '.' && num[v.F][v.S + 1] == -1) {
          q.emplace(v.F, v.S + 1);
          temp.emplace(v.F, v.S + 1);
          num[v.F][v.S + 1] = num[v.F][v.S];
        }
      }
    }
    while (!temp.empty()) {
      auto v = temp.front();
      temp.pop();
      for (ll i = -2; i <= 2; i++) {
        for (ll j = -2; j <= 2; j++) {
          if (is_ok(v.F + i, v.S + j, h, w)) {
            if (s[v.F + i][v.S + j] == '.' && num[v.F + i][v.S + j] == -1) {
              q.emplace(v.F + i, v.S + j);
              next.emplace(v.F + i, v.S + j);
              num[v.F + i][v.S + j] = num[v.F][v.S] + 1;
            }
          }
        }
      }
    }
    // next -> temp
    while (!next.empty()) {
      auto v = next.front();
      next.pop();
      temp.emplace(v);
    }
  }
  cout << -1;
  return 0;
}