权值为1时,就是一个线段覆盖问题。
根据权值为1的贪心思路,可以有这样一个DP方程
$f_{r_i}=\min\limits_{a_i-1\le x<b_i}\{f_x\}+c_1$
线段树维护就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define gc getchar()
using namespace std;
const int N=4e5+10;
const int M=1e5+10;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(int x)
{
    if(x<0)x=-x,putchar(x%10+48);
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
struct node{int l,r,d;bool operator <(const node a)const{return r==a.r?d<a.d:r<a.r;}}a[M];
int b[N],sz;
void disc()
{
    sort(b+1,b+sz+1);int len=0;
    for(int i=1;i<=sz;i++)
        if(i==1||b[i]!=b[i-1])b[++len]=b[i];
    sz=len;
}
inline int get(int d)
{
    int l=1,r=sz;
    while(l<r)
    {
        int mid=l+r>>1;
        if(b[mid]<d)l=mid+1;
        else r=mid;
    }
    return l;
}
int d[N<<2],f[N];
void update(int p,int l,int r,int x,int val)
{
    if(l==r){d[p]=val;return ;}
    int mid=l+r>>1;
    if(x<=mid)update(p<<1,l,mid,x,val);
    else update(p<<1|1,mid+1,r,x,val);
    d[p]=min(d[p<<1],d[p<<1|1]);
}
int query(int p,int l,int r,int ql,int qr)
{
    if(ql<=l&&qr>=r)return d[p];
    int mid=l+r>>1,val=0x3f3f3f3f;
    if(ql<=mid)val=min(val,query(p<<1,l,mid,ql,qr));
    if(qr>mid)val=min(val,query(p<<1|1,mid+1,r,ql,qr));
    return val;
}
int main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    memset(d,0x3f,sizeof(d));memset(f,0x3f,sizeof(f));
    int n,l,r;qr(n),qr(l),qr(r);
    b[++sz]=l-1,b[++sz]=l;
    for(int i=1;i<=n;i++){qr(a[i].l),qr(a[i].r),qr(a[i].d),b[++sz]=a[i].l,b[++sz]=a[i].l-1,b[++sz]=a[i].r,b[++sz]=a[i].r-1;}
    disc();
    f[get(l-1)]=0;
    update(1,1,sz,get(l-1),0);
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(a[i].r<l)continue;
        int R=get(a[i].r);
        int w=query(1,1,sz,get(a[i].l-1),get(a[i].r-1));
        if(f[R]>w+a[i].d)f[R]=w+a[i].d,update(1,1,sz,R,f[R]);
        if(a[i].l>r)break; 
    }
    int ans;
    if((ans=query(1,1,sz,get(r),sz))>=0x3f3f3f3f)puts("-1");
    else qw(ans),puts("");
    return 0;
}