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>
#define ll long long
using namespace std;
int a[100005],b[100005],c[100005],d[100005],e[400005];
ll r1[1<<20],r2[1<<20];
void add(ll *a,int poz,ll val)
{
    poz+=1<<19;
    while(poz){
        a[poz]=min(a[poz],val);
        poz/=2;
    }
}
ll rem(ll *a,int poz,int poz2)
{
    ll ans=1e18;
    poz+=1<<19;
    poz2+=1<<19;
    while(poz<poz2){
        if (poz&1)
            ans=min(ans,a[poz++]);
        if (~poz2&1)
            ans=min(ans,a[poz2--]);
        poz=poz/2;
        poz2=poz2/2;
    }
    if (poz==poz2)
        ans=min(ans,a[poz]);
    return ans;
}
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int n,m,i;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
    int u=0;
    e[u++]=1;
    e[u++]=m;
    for(i=0;i<n;i++){
        e[u++]=a[i];
        e[u++]=b[i];
        e[u++]=c[i];
    }
    sort(e,e+u);
    u=unique(e,e+u)-e;
    for(i=0;i<n;i++){
        a[i]=lower_bound(e,e+u,a[i])-e;
        b[i]=lower_bound(e,e+u,b[i])-e;
        c[i]=lower_bound(e,e+u,c[i])-e;
    }
    for(i=0;i<(1<<20);i++)
        r1[i]=r2[i]=1e18;
    add(r1,0,0);
    add(r2,u-1,0);
    ll ans=1e18;
    for(i=0;i<n;i++){
        ll aux1=rem(r1,a[i],b[i]),aux2=rem(r2,a[i],b[i]);
        add(r1,c[i],aux1+d[i]);
        add(r2,c[i],aux2+d[i]);
        ans=min(ans,aux1+aux2+d[i]);
    }
    if (ans==1e18)
        printf("-1\n");
    else
        printf("%lld\n",ans);
return 0;
}
Compilation message (stderr)
pinball.cpp: In function 'int main()':
pinball.cpp:37:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   37 |     scanf("%d%d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~
pinball.cpp:39:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   39 |         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... |