rt,一直 Wrong asnwer on Test 9
思路是先排序,线段树维护区间和,区间查询最小值
菜鸡调不出来求查错/kk
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
struct FyxTree{
int l,r,sum,lazy;
}a[(N*10)<<3];
int ls(int x){return x<<1;} int rs(int x){return x<<1|1;}
void update(int k){a[k].sum=min(a[ls(k)].sum,a[rs(k)].sum);}
void pushdown(int k){
if(a[k].l!=a[k].r){
a[ls(k)].sum+=(a[ls(k)].r-a[ls(k)].l+1)*a[k].lazy;
a[rs(k)].sum+=(a[rs(k)].r-a[rs(k)].l+1)*a[k].lazy;
a[ls(k)].lazy+=a[k].lazy;a[rs(k)].lazy+=a[k].lazy;
}
a[k].lazy=0;
}
void build(int k,int l,int r){
a[k].l=l,a[k].r=r,a[k].lazy=0;
if(l==r)a[k].sum=0;
else{
int mid=l+r>>1;
build(ls(k),l,mid);
build(rs(k),mid+1,r);
update(k);
}
}
void change(int k,int l,int r,int x){
pushdown(k);
if(a[k].l==l&&a[k].r==r){
a[k].sum+=(r-l+1)*x;
a[k].lazy+=x;
}
else{
int mid=a[k].l+a[k].r>>1;
if(r<=mid)change(ls(k),l,r,x);
else if(l>mid)change(rs(k),l,r,x);
else change(ls(k),l,mid,x),change(rs(k),mid+1,r,x);
update(k);
}
}
int query(int k,int l,int r){
if(a[k].lazy)pushdown(k);
if(a[k].l==l&&a[k].r==r)return a[k].sum;
int mid=(a[k].l+a[k].r)/2;
if(r<=mid)return query(ls(k),l,r);
else if(l>mid)return query(rs(k),l,r);
else return min(query(ls(k),l,mid),query(rs(k),mid+1,r));
}
struct Seg{
int l,r,w;
}A[N*3];
bool cmp(Seg a,Seg b){return (a.w!=b.w)?(a.w<b.w):(a.r<b.r);}
int n,m,ans;
int main(){
n=read(),m=read();
if(n==1){
puts("0");return 0;
}
for(int i=1;i<=n;i++)A[i].l=read(),A[i].r=read(),A[i].w=read();
sort(A+1,A+n+1,cmp);
build(1,1,m);
change(1,A[1].l,A[1].r,1);
ans=1<<30;
for(int i=1,j=2;i<=n;i++){
while(j<=n&&query(1,1,m)==0)change(1,A[j].l,A[j].r,1),j++;
if(query(1,1,m)>0)ans=min(ans,A[j-1].w-A[i].w);
change(1,A[i].l,A[i].r,-1);
}
printf("%d\n",ans);
return 0;
}