简单的双指针操作,如果满足条件就右移做指针,当然要首先满足右指针在右
因为端点可能会有重复,所以就写成了左闭右开,搞成了区间覆盖
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define re int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=4e6+5;//?????????? 4e8
struct node
{
int l,r,sum,add;
}e[N];
int n,m;
struct nc
{
int l,r,w;
}t[N];
bool cmp(nc i,nc j)
{
return i.w<j.w;
}
void push(int p)
{
e[p].sum=min(e[ls(p)].sum,e[rs(p)].sum);
}
void spread(int p)
{
if(e[p].add)
{
e[ls(p)].sum+=e[p].add;
e[rs(p)].sum+=e[p].add;
e[ls(p)].add+=e[p].add;
e[rs(p)].add+=e[p].add;
e[p].add=0;
}
}
void bulid(int p,int l,int r)
{
e[p].l=l,e[p].r=r;
e[p].sum=e[p].add=0;
if(l==r) return;
int mid=(l+r)>>1;
bulid(ls(p),l,mid);bulid(rs(p),mid+1,r);
push(p);
}
void change(int p,int l,int r,int d)
{
if(l<=e[p].l&&e[p].r<=r)
{
// cout<<l<<" "<<e[p].l<<" "<<e[p].r<<" "<<r<<endl;
e[p].sum+=d;
e[p].add+=d;
return;
}
spread(p);
int mid=(e[p].l+e[p].r)>>1;
if(l<=mid) change(ls(p),l,r,d);
if(mid<r) change(rs(p),l,r,d);
push(p);
}
void solve()
{
cin>>n>>m;
for(re i=1;i<=n;i++) scanf("%lld%lld%lld",&t[i].l,&t[i].r,&t[i].w),t[i].r--;
sort(t+1,t+n+1,cmp);
bulid(1,1,m-1);
int ans=1e18;
for(re l=1,r=0;l<=n;l++)
{
while(!e[1].sum)
{
if(++r>n)
{
cout<<ans<<endl;
return;
}
change(1,t[r].l,t[r].r,1);
}
ans=min(ans,t[r].w-t[l].w);
change(1,t[l].l,t[l].r,-1);
}
cout<<ans<<endl;
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case %d:\n",index);
solve();
// puts("");
}
return 0;
}
/*
1
6 5
0 0 0 122 499 8888
*/