This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
#include <set>
#include <unordered_map>
using namespace std;
#define ll long long
const ll INF = 1000000000000000000;
const int MAX_M = 100001;
int a[MAX_M], b[MAX_M], c[MAX_M], d[MAX_M];
ll dp[MAX_M], dp2[MAX_M], best[4*MAX_M], seg[13*MAX_M];
void update(int v, int tl, int tr, int pos, ll x) {
    if (tl == tr) seg[v] = x;
    else {
        int tm = (tl+tr) >> 1;
        if (pos <= tm) update(v<<1, tl, tm, pos, x);
        else update(v<<1|1, tm+1, tr, pos, x);
        seg[v] = min(seg[v<<1], seg[v<<1|1]);
    }
}
ll query(int v, int tl, int tr, int l, int r) {
    if (l > r) return INF;
    if (l == tl && r == tr) return seg[v];
    int tm = (tl+tr) >> 1;
    return min(query(v<<1, tl, tm, l, min(r, tm)), query(v<<1|1, tm+1, tr, max(l, tm+1), r));
}
int main() {
    int m, n, cur=0;
    scanf("%d%d", &m, &n);
    set<int> s = {1, n};
    unordered_map<int, int> z;
    for (int i=1; i<=m; i++) {
        scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
        s.insert(a[i]), s.insert(b[i]), s.insert(c[i]);
    }
    for (int i : s) z[i] = ++cur;
    for (int i=1; i<=m; i++) a[i] = z[a[i]], b[i] = z[b[i]], c[i] = z[c[i]];
    fill(&seg[0], &seg[13*MAX_M], INF);
    fill(&best[0], &best[4*MAX_M], INF);
    for (int i=1; i<=m; i++) update(1, 1, cur, c[i], best[c[i]] = min(best[c[i]], dp[i] = d[i] + (a[i]==1 ? 0 : query(1, 1, cur, a[i], b[i]))));
    fill(&seg[0], &seg[13*MAX_M], INF);
    fill(&best[0], &best[4*MAX_M], INF);
    for (int i=1; i<=m; i++) update(1, 1, cur, c[i], best[c[i]] = min(best[c[i]], dp2[i] = d[i] + (b[i]==cur ? 0 : query(1, 1, cur, a[i], b[i]))));
    ll ans = INF;
    for (int i=1; i<=m; i++) ans = min(ans, dp[i]+dp2[i]-d[i]);
    printf("%lld\n", ans == INF ? -1 : ans);
}
Compilation message (stderr)
pinball.cpp: In function 'int main()':
pinball.cpp:33:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   33 |     scanf("%d%d", &m, &n);
      |     ~~~~~^~~~~~~~~~~~~~~~
pinball.cpp:37:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   37 |         scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |