Problem p02703 (C++)

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

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, int> PLI;
const int MN = 50;
const int MM = 100;
const int MA = 51;
const int MC = 2 * MN * MA;
const int MV = MN * MC + 5;
const LL INF = 0x3f3f3f3f3f3f3f3f;
// sp at most go through less tahn 2n node 2n-1 edges?
// V = 50*2*50*50=250 000
// E = 100*2*50*50=500 000

vector<PII> g[MV];

int n, m, s;

inline int id(int u, int val) { return u * (MC) + val; }

LL dis[MV];
int vis[MV];
priority_queue<PLI, vector<PLI>, greater<PLI>> qu;
void dij(int st, int v) {
  memset(dis, INF, sizeof(dis));
  qu.push({0, id(st, v)});
  dis[id(st, v)] = 0;
  while (!qu.empty()) {
    PLI p = qu.top();
    qu.pop();
    int u = p.second;
    LL d = dis[u];
    if (vis[u])
      continue;
    vis[u] = 1;
    for (auto e : g[u]) {
      int v = e.first;
      LL w = e.second;
      if (vis[v])
        continue;
      if (dis[v] > d + w) {
        dis[v] = d + w;
        qu.push({dis[v], v});
      }
    }
  }
}

int main() {
  scanf("%d%d%d", &n, &m, &s);
  int u, v, a, b;
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d%d", &u, &v, &a, &b);
    for (int i = 0; i + a < MC; i++) {
      g[id(u, i + a)].push_back({id(v, i), b});
      g[id(v, i + a)].push_back({id(u, i), b});
    }
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a, &b);
    for (int j = 0; j + a < MC; j++)
      g[id(i, j)].push_back({id(i, j + a), b});
  }
  if (s >= MC)
    s = MC - 1;
  dij(1, s);
  for (int i = 2; i <= n; i++) {
    LL mi = INF;
    for (int j = 0; j < MC; j++)
      mi = min(mi, dis[id(i, j)]);
    printf("%lld\n", mi);
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, int> PLI;
const int MN = 51;
const int MM = 101;
const int MA = 51;
const int MC = 2 * MN * MA;
const int MV = MN * MC + 5;
const LL INF = 0x3f3f3f3f3f3f3f3f;
// sp at most go through less tahn 2n node 2n-1 edges?
// V = 50*2*50*50=250 000
// E = 100*2*50*50=500 000

vector<PII> g[MV];

int n, m, s;

inline int id(int u, int val) { return u * (MC) + val; }

LL dis[MV];
int vis[MV];
priority_queue<PLI, vector<PLI>, greater<PLI>> qu;
void dij(int st, int v) {
  memset(dis, INF, sizeof(dis));
  qu.push({0, id(st, v)});
  dis[id(st, v)] = 0;
  while (!qu.empty()) {
    PLI p = qu.top();
    qu.pop();
    int u = p.second;
    LL d = dis[u];
    if (vis[u])
      continue;
    vis[u] = 1;
    for (auto e : g[u]) {
      int v = e.first;
      LL w = e.second;
      if (vis[v])
        continue;
      if (dis[v] > d + w) {
        dis[v] = d + w;
        qu.push({dis[v], v});
      }
    }
  }
}

int main() {
  scanf("%d%d%d", &n, &m, &s);
  int u, v, a, b;
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d%d", &u, &v, &a, &b);
    for (int i = 0; i + a < MC; i++) {
      g[id(u, i + a)].push_back({id(v, i), b});
      g[id(v, i + a)].push_back({id(u, i), b});
    }
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a, &b);
    for (int j = 0; j + a < MC; j++)
      g[id(i, j)].push_back({id(i, j + a), b});
  }
  if (s >= MC)
    s = MC - 1;
  dij(1, s);
  for (int i = 2; i <= n; i++) {
    LL mi = INF;
    for (int j = 0; j < MC; j++)
      mi = min(mi, dis[id(i, j)]);
    printf("%lld\n", mi);
  }
  return 0;
}