Problem p02703 (C++)

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

using namespace std;

#define INF 1001000100010001000
#define MOD 1000000007
#define EPS 1e-10
#define int long long
#define rep(i, N) for (int i = 0; i < N; i++)
#define Rep(i, N) for (int i = 1; i < N; i++)
#define For(i, a, b) for (int i = (a); i < (b); i++)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define pii pair<int, int>
#define vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define vvb vector<vb>
#define vp vector<pii>
#define all(a) (a).begin(), (a).end()
#define Int(x)                                                                 \
  int x;                                                                       \
  cin >> x;
#define int2(x, y)                                                             \
  Int(x);                                                                      \
  Int(y);
#define int3(x, y, z)                                                          \
  Int(x);                                                                      \
  int2(y, z);
#define in(x, a, b) ((a) <= (x) && (x) < (b))
#define fir first
#define sec second
#define ffir first.first
#define fsec first.second
#define sfir second.first
#define ssec second.second
#define Decimal fixed << setprecision(10)

// int dxy[5] = {0, 1, 0, -1, 0};
//  cmd

using Weight = int;
using Flow = int;
struct Edge {
  int s, d;
  Weight w;
  Flow c;
  Edge(){};
  Edge(int s, int d, Weight w = 1) : s(s), d(d), w(w), c(w){};
};
bool operator<(const Edge &e1, const Edge &e2) { return e1.w < e2.w; }
bool operator>(const Edge &e1, const Edge &e2) { return e2 < e1; }
inline ostream &operator<<(ostream &os, const Edge &e) {
  return (os << '(' << e.s << ", " << e.d << ", " << e.w << ')');
}

using Edges = vector<Edge>;
using Graph = vector<Edges>;
using Array = vector<Weight>;
using Matrix = vector<Array>;

void addArc(Graph &g, int s, int d, Weight w = 1) {
  g[s].emplace_back(s, d, w);
}
void addEdge(Graph &g, int a, int b, Weight w = 1) {
  addArc(g, a, b, w);
  addArc(g, b, a, w);
}

// 単一始点最短経路(負閉路なし)
// Dijkstra O((|E|+|V|)log|V|)
// dist: 始点から各頂点までの最短距離
// 戻り値: 最短経路木の親頂点(根は-1)
vector<int> dijkstra(const Graph &g, int s, Array &dist) {
  int n = g.size();
  assert(s < n);
  enum { WHITE, GRAY, BLACK };
  vector<int> color(n, WHITE);
  color[s] = GRAY;
  vector<int> prev(n, -1);
  dist.assign(n, INF);
  dist[s] = 0;
  using State = tuple<Weight, int, int>; // 始点からの最短距離 子 親
  priority_queue<State, vector<State>, greater<State>> pq;
  pq.emplace(0, s, -1);
  while (pq.size()) {
    Weight d;
    int v, u;
    tie(d, v, u) = pq.top();
    pq.pop();
    if (dist[v] < d)
      continue;
    color[v] = BLACK;
    prev[v] = u;
    for (auto &e : g[v]) {
      if (color[e.d] == BLACK)
        continue;
      if (dist[e.d] > dist[v] + e.w) {
        dist[e.d] = dist[v] + e.w;
        pq.emplace(dist[e.d], e.d, v);
        color[e.d] = GRAY;
      }
    }
  }
  return prev;
}

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int3(n, m, s);

  Graph g(n * 2600);
  for (int i = 0; i < m; i++) {
    int2(tmpx, tmpy);
    tmpx--;
    tmpy--;
    int2(c, t);
    for (int j = 2599; j - c >= 0; j--) {
      addArc(g, tmpx * 2600 + j, tmpy * 2600 + j - c, t);
      addArc(g, tmpy * 2600 + j, tmpx * 2600 + j - c, t);
    }
  }

  rep(i, n) {
    int2(c, d);
    for (int j = 0; j + c < 2600 - 1; j++) {
      addArc(g, i * 2600 + j, i * 2600 + j + c, d);
    }
  }

  vi ans(n * 2600, INF);
  ans[s] = 0;
  dijkstra(g, s, ans);

  Rep(i, n) {
    int yui = INF;
    rep(j, 2600) { yui = min(yui, ans[i * 2600 + j]); }
    // cout << ": " <<  yui << endl;
    cout << yui << endl;
  }

  return 0;
}


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

using namespace std;

#define INF 1001000100010001000
#define MOD 1000000007
#define EPS 1e-10
#define int long long
#define rep(i, N) for (int i = 0; i < N; i++)
#define Rep(i, N) for (int i = 1; i < N; i++)
#define For(i, a, b) for (int i = (a); i < (b); i++)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define pii pair<int, int>
#define vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define vvb vector<vb>
#define vp vector<pii>
#define all(a) (a).begin(), (a).end()
#define Int(x)                                                                 \
  int x;                                                                       \
  cin >> x;
#define int2(x, y)                                                             \
  Int(x);                                                                      \
  Int(y);
#define int3(x, y, z)                                                          \
  Int(x);                                                                      \
  int2(y, z);
#define in(x, a, b) ((a) <= (x) && (x) < (b))
#define fir first
#define sec second
#define ffir first.first
#define fsec first.second
#define sfir second.first
#define ssec second.second
#define Decimal fixed << setprecision(10)

// int dxy[5] = {0, 1, 0, -1, 0};
//  cmd

using Weight = int;
using Flow = int;
struct Edge {
  int s, d;
  Weight w;
  Flow c;
  Edge(){};
  Edge(int s, int d, Weight w = 1) : s(s), d(d), w(w), c(w){};
};
bool operator<(const Edge &e1, const Edge &e2) { return e1.w < e2.w; }
bool operator>(const Edge &e1, const Edge &e2) { return e2 < e1; }
inline ostream &operator<<(ostream &os, const Edge &e) {
  return (os << '(' << e.s << ", " << e.d << ", " << e.w << ')');
}

using Edges = vector<Edge>;
using Graph = vector<Edges>;
using Array = vector<Weight>;
using Matrix = vector<Array>;

void addArc(Graph &g, int s, int d, Weight w = 1) {
  g[s].emplace_back(s, d, w);
}
void addEdge(Graph &g, int a, int b, Weight w = 1) {
  addArc(g, a, b, w);
  addArc(g, b, a, w);
}

// 単一始点最短経路(負閉路なし)
// Dijkstra O((|E|+|V|)log|V|)
// dist: 始点から各頂点までの最短距離
// 戻り値: 最短経路木の親頂点(根は-1)
vector<int> dijkstra(const Graph &g, int s, Array &dist) {
  int n = g.size();
  assert(s < n);
  enum { WHITE, GRAY, BLACK };
  vector<int> color(n, WHITE);
  color[s] = GRAY;
  vector<int> prev(n, -1);
  dist.assign(n, INF);
  dist[s] = 0;
  using State = tuple<Weight, int, int>; // 始点からの最短距離 子 親
  priority_queue<State, vector<State>, greater<State>> pq;
  pq.emplace(0, s, -1);
  while (pq.size()) {
    Weight d;
    int v, u;
    tie(d, v, u) = pq.top();
    pq.pop();
    if (dist[v] < d)
      continue;
    color[v] = BLACK;
    prev[v] = u;
    for (auto &e : g[v]) {
      if (color[e.d] == BLACK)
        continue;
      if (dist[e.d] > dist[v] + e.w) {
        dist[e.d] = dist[v] + e.w;
        pq.emplace(dist[e.d], e.d, v);
        color[e.d] = GRAY;
      }
    }
  }
  return prev;
}

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int3(n, m, s);
  if (s > 2599)
    s = 2599;

  Graph g(n * 2600);
  for (int i = 0; i < m; i++) {
    int2(tmpx, tmpy);
    tmpx--;
    tmpy--;
    int2(c, t);
    for (int j = 2599; j - c >= 0; j--) {
      addArc(g, tmpx * 2600 + j, tmpy * 2600 + j - c, t);
      addArc(g, tmpy * 2600 + j, tmpx * 2600 + j - c, t);
    }
  }

  rep(i, n) {
    int2(c, d);
    for (int j = 0; j + c < 2600 - 1; j++) {
      addArc(g, i * 2600 + j, i * 2600 + j + c, d);
    }
  }

  vi ans(n * 2600, INF);
  ans[s] = 0;
  dijkstra(g, s, ans);

  Rep(i, n) {
    int yui = INF;
    rep(j, 2600) { yui = min(yui, ans[i * 2600 + j]); }
    // cout << ": " <<  yui << endl;
    cout << yui << endl;
  }

  return 0;
}