莫名其妙 MLE 掉了。
#include<bits/stdc++.h>
using namespace std;
const int N=1000001,INF=0x3f3f3f3f;
int n,t,f[N<<1],tot,cur,ls[N<<1],rs[N<<1],ans=INF;
struct node{
int l,r;
bool operator<(node b){
return(r!=b.r?r<b.r:l<b.l);
}
}a[25001];
void pushup(int x){
f[x]=min(f[ls[x]],f[rs[x]]);
return;
}
void build(int l,int r,int&cur){
cur=++tot;
if(l==r){
f[cur]=INF;
return;
}
int mid=l+r>>1;
return build(l,mid,ls[cur]),build(mid+1,r,rs[cur]),pushup(cur);
}
int qry(int l,int r,int ql,int qr,int cur){
if(ql<=l&&r<=qr)
return f[cur];
int mid=l+r>>1,ans=INF;
if(ql<=mid)
ans=min(ans,qry(l,mid,ql,qr,ls[cur]));
if(mid<qr)
ans=min(ans,qry(mid+1,r,ql,qr,rs[cur]));
return ans;
}
void modify(int l,int r,int qc,int x,int cur){
if(l==r){
f[cur]=min(f[cur],x);
return;
}
int mid=l+r>>1;
if(qc<=mid)
modify(l,mid,qc,x,ls[cur]);
else
modify(mid+1,r,qc,x,rs[cur]);
return pushup(cur);
}
int main(){
cin>>n>>t;
build(1,t,cur);
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
if(a[i].l==1)
modify(1,n,a[i].r,1,1);
}
sort(a+1,a+n+1);
for(int i=1,k;i<=n;i++)
modify(1,n,a[i].r,min(qry(1,n,a[i].l-1,a[i].r-1,1)+1,qry(1,n,a[i].r,a[i].r,1)),1);
ans=qry(1,n,t,t,1);
if(ans==INF)
cout<<-1;
else
cout<<ans;
return 0;
}