#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>
const int inf = 1e17,N = 5e5+1,MOD =  998244353;
struct Segment {
    int a,b,c,p;
};
vi v;
int idx(int x) {
    return (upper_bound(all(v),x)-v.begin());
}
struct ST {
    vi t;
    ST(int nn) {
        t.assign(4*nn+1,inf);
    }
    void update(int node,int l,int r,int p,int v) {
        if (l == r) {
            t[node] = min(t[node],v);
            return;
        }
        int m = (l+r) >> 1;
        if (p <= m) update(2*node,l,m,p,v);
        else update(2*node+1,m+1,r,p,v);
        t[node] = min(t[2*node],t[2*node+1]);
    }
    int query(int node,int l,int r,int L,int R) {
        if (l > R || r < L ) return inf;
        if (l >= L && r <= R) return t[node];
        int m = (l+r) >> 1;
        return min(query(2*node,l,m,L,R),query(2*node+1,m+1,r,L,R)); 
    }
};
void solve() {  
    int m,n;
    cin >> m >> n;
    vector<Segment> segs(m+1);
    for (int i=1;i<=m;i++) {
        cin >> segs[i].a >> segs[i].b >> segs[i].c >> segs[i].p;
        v.push_back(segs[i].a);
        v.push_back(segs[i].b);
        v.push_back(segs[i].c);
    }
    v.push_back(1);
    v.push_back(n);
    sort(all(v));
    v.erase(unique(all(v)),v.end());
    int ans = inf;
    int sz = v.size();
    ST st(sz),st2(sz);
    vi dp(sz+1,inf),dp2(sz+1,inf);
    st.update(1,1,sz,1,0);
    st2.update(1,1,sz,sz,0);
    dp[1] = 0;
    dp2[sz] = 0; 
    //point update range max
    for (int i=1;i<=m;i++) {
        segs[i].a = idx(segs[i].a);
        segs[i].b = idx(segs[i].b);
        segs[i].c = idx(segs[i].c);
        ans = min(ans,st.query(1,1,sz,segs[i].a,segs[i].b)+st2.query(1,1,sz,segs[i].a,segs[i].b)+segs[i].p);
        dp[segs[i].c] = min(dp[segs[i].c],st.query(1,1,sz,segs[i].a,sz)+segs[i].p);
        st.update(1,1,sz,segs[i].c,dp[segs[i].c]);
        dp2[segs[i].c] = min(dp2[segs[i].c],st2.query(1,1,sz,1,segs[i].b)+segs[i].p);
        st2.update(1,1,sz,segs[i].c,dp2[segs[i].c]);
    }
    if (ans >= inf) cout << -1 << '\n';
    else cout << ans << '\n';
}
int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
| # | 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... |