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<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const ll inf = 1e18;
ll n, m;
vector<ll> cp;
vector<tuple<ll,ll,ll,ll> > a;
struct segtree {
	ll val[1234567], lim;
	void init () {
		for(lim=1; lim<=cp.size(); lim<<=1);
		for(ll i=2*lim; --i; ) val[i] = inf;
	}
	void upd (ll P, ll V) {
		P += lim;
		while(P) {
			val[P] = min(val[P], V);
			P >>= 1;
		}
	}
	ll get (ll S, ll E) {
		ll ret = inf;
		S += lim; E += lim;
		while(S<=E) {
			if(S%2==1) {ret = min(val[S], ret); S++;}
			if(E%2==0) {ret = min(val[E], ret); E--;}
			S >>= 1; E >>= 1;
		}
		return ret;
	}
} l, r;
ll cpr (ll X) {
	return lower_bound(cp.begin(), cp.end(), X) - cp.begin();
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++) {
		ll A, B, C, D;
		scanf("%lld%lld%lld%lld",&A,&B,&C,&D);
		a.pb(make_tuple(A,B,C,D));
		cp.pb(A); cp.pb(B); cp.pb(C);
	}
	cp.pb(1); cp.pb(m);
	sort(cp.begin(), cp.end());
	cp.erase(unique(cp.begin(), cp.end()), cp.end());
	l.init(); l.upd(0, 0);
	r.init(); r.upd(cp.size()-1, 0);
	ll ans = inf;
	for(auto &T : a) {
		ll A, B, C, D; tie(A, B, C, D) = T;
		A = cpr(A); B = cpr(B); C = cpr(C);
		ll X = l.get(A, B), Y = r.get(A, B);
		ans = min(ans, X + Y + D);
		l.upd(C, X+D); r.upd(C, Y+D);
	}
	printf("%lld\n", (ans == inf ? -1 : ans));
}
Compilation message (stderr)
pinball.cpp: In member function 'void segtree::init()':
pinball.cpp:15:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(lim=1; lim<=cp.size(); lim<<=1);
                 ^
pinball.cpp: In function 'int main()':
pinball.cpp:43:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld",&n,&m);
                         ^
pinball.cpp:46:40: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld%lld",&A,&B,&C,&D);
                                        ^| # | 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... |