Problem p02726 (C++)

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

//{ SFT
using namespace std;
#define int int64_t
#define rep(i, a, n) for (int i = (a); i < (n); ++i)
#define reps(i, a, n) for (int i = (a); i > (n); --i)
#define arep(i, x) for (auto &&i : (x))
#define irep(i, x) for (auto i = (x).begin(); i != (x).end(); ++i)
// 降順はgreater<T>()
#define all(x) (x).begin(), (x).end()
#define rv(s) reverse((s).begin(), (s).end())
// gcd lcmはそのままok
#define gcd(a, b) __gcd(a, b)
#define bits(n) (1 << (n))
#define pcnt(x) __builitin_popcountll(x)
// 配列内等要素削除
#define unique(x) (x).erase(unique(x).begin(),(x).end()),(x).end());
#define Fixed(n) fixed << setprecision(n)
// 総和
#define sowa(n) ((n) * ((n) + 1)) / 2
#define pb(x, a) (x).push_back(a)
#define fb(x, a) (x).flont_back(a)
#define eb(x, a) (x).emplaes_back(a)
#define F first
#define S second
#define cauto (const auto &)
template <class A, class B> using pii = vector<pair<A, B>>;
template <class T> // 昇順
using min_heap = priority_queue<T, vector<T>, greater<T>>;
template <class T> // 降順
using max_heap = priority_queue<T>;
template <class A, class B> using umap = unordered_map<A, B>;
template <class A> using uset = unordered_set<A>;
template <class T>
bool chmax(T &a, const T &b) // 最大値更新 返り値はbool
{
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) // 最小値更新 返り値はbool
{
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
constexpr int INF = 0x3f3f3f3f;
constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr long long mod1 = 1e9 + 7;
constexpr long long mod2 = 998244353;
//} END
constexpr int MAX_N = 2 * 1e3;
using P = pair<int, int>; // firstは最短距離,secondは頂点の番号

int n, x, y;
vector<vector<P>> graph;
int min_cost[MAX_N];

void Dijkstra(int s) {
  // 昇順でfirstを小さい方から取る
  min_heap<P> que;
  fill(min_cost, min_cost + n + 2, INF);
  min_cost[s] = 0;
  que.emplace(0, s);

  while (!que.empty()) {
    int now_cost, now_node;
    tie(now_cost, now_node) = que.top();
    que.pop();

    if (min_cost[now_node] <
        now_cost) // queの値より新しいcostの方が小さいとき見ない
    {
      continue;
    }

    rep(i, 0, graph[now_node].size()) {
      int next_node, next_cost;
      tie(next_node, next_cost) = graph[now_node][i];

      if (chmin(min_cost[next_node],
                min_cost[now_node] + next_cost)) // 最短経路の更新
      {                                          // 最短経路更新
        que.emplace(min_cost[next_node], next_node);
      }
    }
  }
}

signed main(void) {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);

  cin >> n >> x >> y;

  graph.resize(n + 1);

  rep(i, 1, n) {
    graph[i].emplace_back(i + 1, 1); // グラフの構築
    graph[i + 1].emplace_back(i, 1);
  }
  graph[x].emplace_back(y, 1);
  graph[y].emplace_back(x, 1);

  vector<int> cnt(n + 1);

  rep(i, 1, n) {
    Dijkstra(i);
    // cout << i << '\n';
    rep(j, i + 1, n + 1) {
      ++cnt[min_cost[j]];
      // cout << j << ' ' << min_cost[j] << '\n';
    }
    // cout << '\n';
  }

  rep(i, 1, n) { cout << cnt[i] << '\n'; }

  return 0;
}

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

//{ SFT
using namespace std;
#define int int64_t
#define rep(i, a, n) for (int i = (a); i < (n); ++i)
#define reps(i, a, n) for (int i = (a); i > (n); --i)
#define arep(i, x) for (auto &&i : (x))
#define irep(i, x) for (auto i = (x).begin(); i != (x).end(); ++i)
// 降順はgreater<T>()
#define all(x) (x).begin(), (x).end()
#define rv(s) reverse((s).begin(), (s).end())
// gcd lcmはそのままok
#define gcd(a, b) __gcd(a, b)
#define bits(n) (1 << (n))
#define pcnt(x) __builitin_popcountll(x)
// 配列内等要素削除
#define unique(x) (x).erase(unique(x).begin(),(x).end()),(x).end());
#define Fixed(n) fixed << setprecision(n)
// 総和
#define sowa(n) ((n) * ((n) + 1)) / 2
#define pb(x, a) (x).push_back(a)
#define fb(x, a) (x).flont_back(a)
#define eb(x, a) (x).emplaes_back(a)
#define F first
#define S second
#define cauto (const auto &)
template <class A, class B> using pii = vector<pair<A, B>>;
template <class T> // 昇順
using min_heap = priority_queue<T, vector<T>, greater<T>>;
template <class T> // 降順
using max_heap = priority_queue<T>;
template <class A, class B> using umap = unordered_map<A, B>;
template <class A> using uset = unordered_set<A>;
template <class T>
bool chmax(T &a, const T &b) // 最大値更新 返り値はbool
{
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) // 最小値更新 返り値はbool
{
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
constexpr int INF = 0x3f3f3f3f;
constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr long long mod1 = 1e9 + 7;
constexpr long long mod2 = 998244353;
//} END
constexpr int MAX_N = 2 * 10e3;
using P = pair<int, int>; // firstは最短距離,secondは頂点の番号

int n, x, y;
vector<vector<P>> graph;
int min_cost[MAX_N];

void Dijkstra(int s) {
  // 昇順でfirstを小さい方から取る
  min_heap<P> que;
  fill(min_cost, min_cost + n + 2, INF);
  min_cost[s] = 0;
  que.emplace(0, s);

  while (!que.empty()) {
    int now_cost, now_node;
    tie(now_cost, now_node) = que.top();
    que.pop();

    if (min_cost[now_node] <
        now_cost) // queの値より新しいcostの方が小さいとき見ない
    {
      continue;
    }

    rep(i, 0, graph[now_node].size()) {
      int next_node, next_cost;
      tie(next_node, next_cost) = graph[now_node][i];

      if (chmin(min_cost[next_node],
                min_cost[now_node] + next_cost)) // 最短経路の更新
      {                                          // 最短経路更新
        que.emplace(min_cost[next_node], next_node);
      }
    }
  }
}

signed main(void) {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);

  cin >> n >> x >> y;

  graph.resize(n + 1);

  rep(i, 1, n) {
    graph[i].emplace_back(i + 1, 1); // グラフの構築
    graph[i + 1].emplace_back(i, 1);
  }
  graph[x].emplace_back(y, 1);
  graph[y].emplace_back(x, 1);

  vector<int> cnt(n + 1);

  rep(i, 1, n) {
    Dijkstra(i);
    // cout << i << '\n';
    rep(j, i + 1, n + 1) {
      ++cnt[min_cost[j]];
      // cout << j << ' ' << min_cost[j] << '\n';
    }
    // cout << '\n';
  }

  rep(i, 1, n) { cout << cnt[i] << '\n'; }

  return 0;
}