Problem p02868 (C++)

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

const int MX = 100005;
const ll INF = 1000000000LL * 1000000000LL;

int n;

vector<pair<int, int>> neigh[4 * MX];

struct {
  int L, R;
  int pl, pr;
} T[2 * MX];
int nxt;
int buildTree1(int L, int R) {
  if (L == R)
    return L;
  int cur = nxt++;
  T[cur].L = L;
  T[cur].R = R;
  if (L < R) {
    T[cur].pl = buildTree1(L, (L + R) / 2);
    T[cur].pr = buildTree1((L + R) / 2 + 1, R);
    neigh[cur].emplace_back(T[cur].pl, 0);
    neigh[cur].emplace_back(T[cur].pr, 0);
  }
  return cur;
}
int buildTree2(int L, int R) {
  if (L == R)
    return L;
  int cur = nxt++;
  T[cur].L = L;
  T[cur].R = R;
  if (L < R) {
    T[cur].pl = buildTree2(L, (L + R) / 2);
    T[cur].pr = buildTree2((L + R) / 2 + 1, R);
    neigh[T[cur].pl].emplace_back(cur, 0);
    neigh[T[cur].pr].emplace_back(cur, 0);
  }
  return cur;
}
void add1(int L, int R, int to, int c, int cur) {
  if (L <= T[cur].L && R >= T[cur].R) {
    neigh[to].emplace_back(cur, 0);
    return;
  }
  if (L <= T[T[cur].pl].R) {
    add1(L, R, to, c, T[cur].pl);
  }
  if (T[T[cur].pr].L <= R) {
    add1(L, R, to, c, T[cur].pr);
  }
}
void add2(int L, int R, int to, int c, int cur) {
  if (L <= T[cur].L && R >= T[cur].R) {
    neigh[cur].emplace_back(to, c);
    return;
  }
  if (L <= T[T[cur].pl].R) {
    add2(L, R, to, c, T[cur].pl);
  }
  if (T[T[cur].pr].L <= R) {
    add2(L, R, to, c, T[cur].pr);
  }
}

ll d[4 * MX];

int main() {
  int m;
  ignore = scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++)
    T[i].L = T[i].R = i;
  nxt = n + 1;
  int rt1 = buildTree1(1, n);
  int rt2 = buildTree2(1, n);
  while (m--) {
    int l, r, c;
    ignore = scanf("%d %d %d", &l, &r, &c);
    add1(l, r, nxt, c, rt1);
    add2(l, r, nxt, c, rt2);
    nxt++;
  }

  /*
  for (int v = 1; v < nxt; v++) {
          printf("%d: ", v);
          for (auto e : neigh[v]) {
                  printf("(%d %d) ", e.first, e.second);
          }
          printf("\n");
  }
  */

  set<pair<ll, int>> S;
  for (int i = 1; i < 4 * MX; i++)
    d[i] = INF;

  d[1] = 0;
  S.insert({0, 1});

  while (!S.empty()) {
    auto cur = *S.begin();
    S.erase(S.begin());
    int v = cur.second;
    if (cur.first != d[v])
      continue;

    for (auto e : neigh[v]) {
      if (d[e.first] > d[v] + e.second) {
        d[e.first] = d[v] + e.second;
        S.insert({d[e.first], e.first});
      }
    }
  }

  if (d[n] == INF) {
    printf("-1\n");
    return 0;
  }
  cout << d[n] << "\n";
}


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

const int MX = 100005;
const ll INF = 1000000000LL * 1000000000LL;

int n;

vector<pair<int, int>> neigh[4 * MX];

struct {
  int L, R;
  int pl, pr;
} T[4 * MX];
int nxt;
int buildTree1(int L, int R) {
  if (L == R)
    return L;
  int cur = nxt++;
  T[cur].L = L;
  T[cur].R = R;
  if (L < R) {
    T[cur].pl = buildTree1(L, (L + R) / 2);
    T[cur].pr = buildTree1((L + R) / 2 + 1, R);
    neigh[cur].emplace_back(T[cur].pl, 0);
    neigh[cur].emplace_back(T[cur].pr, 0);
  }
  return cur;
}
int buildTree2(int L, int R) {
  if (L == R)
    return L;
  int cur = nxt++;
  T[cur].L = L;
  T[cur].R = R;
  if (L < R) {
    T[cur].pl = buildTree2(L, (L + R) / 2);
    T[cur].pr = buildTree2((L + R) / 2 + 1, R);
    neigh[T[cur].pl].emplace_back(cur, 0);
    neigh[T[cur].pr].emplace_back(cur, 0);
  }
  return cur;
}
void add1(int L, int R, int to, int c, int cur) {
  if (L <= T[cur].L && R >= T[cur].R) {
    neigh[to].emplace_back(cur, 0);
    return;
  }
  if (L <= T[T[cur].pl].R) {
    add1(L, R, to, c, T[cur].pl);
  }
  if (T[T[cur].pr].L <= R) {
    add1(L, R, to, c, T[cur].pr);
  }
}
void add2(int L, int R, int to, int c, int cur) {
  if (L <= T[cur].L && R >= T[cur].R) {
    neigh[cur].emplace_back(to, c);
    return;
  }
  if (L <= T[T[cur].pl].R) {
    add2(L, R, to, c, T[cur].pl);
  }
  if (T[T[cur].pr].L <= R) {
    add2(L, R, to, c, T[cur].pr);
  }
}

ll d[4 * MX];

int main() {
  int m;
  ignore = scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++)
    T[i].L = T[i].R = i;
  nxt = n + 1;
  int rt1 = buildTree1(1, n);
  int rt2 = buildTree2(1, n);
  while (m--) {
    int l, r, c;
    ignore = scanf("%d %d %d", &l, &r, &c);
    add1(l, r, nxt, c, rt1);
    add2(l, r, nxt, c, rt2);
    nxt++;
  }

  /*
  for (int v = 1; v < nxt; v++) {
          printf("%d: ", v);
          for (auto e : neigh[v]) {
                  printf("(%d %d) ", e.first, e.second);
          }
          printf("\n");
  }
  */

  set<pair<ll, int>> S;
  for (int i = 1; i < 4 * MX; i++)
    d[i] = INF;

  d[1] = 0;
  S.insert({0, 1});

  while (!S.empty()) {
    auto cur = *S.begin();
    S.erase(S.begin());
    int v = cur.second;
    if (cur.first != d[v])
      continue;

    for (auto e : neigh[v]) {
      if (d[e.first] > d[v] + e.second) {
        d[e.first] = d[v] + e.second;
        S.insert({d[e.first], e.first});
      }
    }
  }

  if (d[n] == INF) {
    printf("-1\n");
    return 0;
  }
  cout << d[n] << "\n";
}