#include<bits/stdc++.h>
#include<algorithm>
#include<random>
#include<chrono>
#include<cstdlib>
#include<ctime>
#include<numeric>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#define int long long
#define ll long long
#define L LLONG_MAX
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define sz(a) ((int)a.size())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define REP(i,k,j) for(int i=k;i>=j;i--)
#define FORD(i,a) for(auto i:a)
#define MASK(i) ((1)<<(i))
#define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_asince_epoch().count())
#define random(l,r) ((l)+(rng()%(r-l+1)))
using namespace std;
const int nmax=1e5+1;
int m,n,crr=0;
int a[nmax],b[nmax],c[nmax],d[nmax];
int lx[nmax],rx[nmax],ans[nmax];
map<int,int> mp;
set<int> s;
void input()
{
    cin >> m >> n;
    FOR(i,1,m) cin >> a[i] >> b[i] >> c[i] >> d[i];
}
struct SEGTREE
{
    vector<int> tree;
    int n;
    
    SEGTREE (int N)
    {
        n=N;
        tree.resize(4*n+1,L);
    }
    
    void update(int id,int l,int r,int x,int val)
    {
        if(x<l || r<x) return;
        if(l==r)
        {
            tree[id]=min(tree[id],val);
            return;
        }
        int mid=(l+r)/2;
        update(id*2,l,mid,x,val);
        update(id*2+1,mid+1,r,x,val);
        tree[id]=min(tree[id*2],tree[id*2+1]);
    }
    
    int get(int id,int l,int r,int x,int y)
    {
        if(y<l || r<x) return L;
        if(x<=l && r<=y) return tree[id];
        int mid=(l+r)/2;
        return min(get(id*2,l,mid,x,y),get(id*2+1,mid+1,r,x,y));
    }
    
    void update(int x,int val)
    {
        update(1,1,n,x,val);
    }
    
    int get(int l,int r)
    {
        return get(1,1,n,l,r);
    }
};
void compress()
{
    s.insert(1);
    s.insert(n);
    FOR(i,1,m)
    {
        s.insert(a[i]);
        s.insert(b[i]);
        s.insert(c[i]);
    }
    FORD(i,s) mp[i]=++crr;
    FOR(i,1,m)
    {
        a[i]=mp[a[i]];
        b[i]=mp[b[i]];
        c[i]=mp[c[i]];
    }
}
void solve()
{
    compress();
    SEGTREE st1(crr);
    SEGTREE st2(crr);
    st1.update(mp[1],0);
    st2.update(mp[n],0);
    FOR(i,1,n) ans[i]=L;
    FOR(i,1,m)
    {
        int lf=st1.get(a[i],b[i]);
        int rt=st2.get(a[i],b[i]);
        if(lf!=L) st1.update(c[i],lf+d[i]);
        if(rt!=L) st2.update(c[i],rt+d[i]);
        if(lf!=L && rt!=L) ans[i]=lf+rt+d[i];
    }
    int res=L;
    FOR(i,1,m) res=min(res,ans[i]);
    if(res==L) cout << -1;
    else cout << res;
}
signed main()
{
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    input();
    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... |