fhq-treap 50pts求助qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<random>
#include<ctime>
using namespace std;
mt19937 rd(time(NULL));
namespace IO{
template<typename T> inline static void read(T &x){x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}if(f==-1) x=-x;}
template<typename T,typename ...Args> inline static void read(T& x,Args& ...args){read(x);read(args...);}
template<typename T> inline static void write(char c,T x){T p=x;if(!p) putchar('0');if(p<0){putchar('-');p=-p;}int cnt[105],tot=0;while(p){cnt[++tot]=p%10;p/=10;}for(int i=tot;i>=1;i--){putchar(cnt[i]+'0');}putchar(c);}
template<typename T,typename ...Args> inline static void write(const char c,T x,Args ...args){write(c,x);write(c,args...);}
};
const int N=2e5+10;
const int INF=0x7fffffff;
int n,m;
int ans;
struct node{int l,r;}a[N];
struct fhq{int size,key,val,l,r;}t[N];
inline bool cmp(node a,node b){
if(a.r==b.r) return a.l<b.l;
return a.r<b.r;
}
int root,cnt;
inline void init(int &k,int _key){t[++cnt].size=1,t[cnt].l=t[cnt].r=0,t[cnt].key=_key,t[cnt].val=rd(),k=cnt;}
inline void pushup(int p){t[p].size=t[t[p].l].size+t[t[p].r].size+1;}
void split(int p,int _key,int &x,int &y){
if(!p) x=y=0;
else if(t[p].key<=_key){
split(t[p].r,_key,t[p].r,y);
pushup(p),x=p;
}else{
split(t[p].l,_key,x,t[p].l);
pushup(p),y=p;
}
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(t[x].val<t[y].val){
t[x].r=merge(t[x].r,y);
pushup(x);return x;
}else{
t[y].l=merge(x,t[y].l);
pushup(y);return y;
}
}
inline void insert(int &root,int key){
int x=0,y=0,z=0;
split(root,key,x,y),init(z,key),root=merge(merge(x,z),y);
}
inline void del(int &root,int _key){
int x=0,y=0,z=0;
split(root,_key,x,y),split(x,_key-1,x,z),z=merge(t[z].l,t[z].r),root=merge(merge(x,z),y);
}
int getval(int p,int _key){
while(1){
if(t[t[p].l].size+1==_key) return t[p].key;
else if(t[t[p].l].size+1<_key) _key=_key-t[t[p].l].size-1,p=t[p].r;
else p=t[p].l;
}
}
inline int prev(int &root,int _key){
int x=0,y=0;
split(root,_key-1,x,y);
if(!x) return -INF;
int pre=getval(x,t[x].size);
root=merge(x,y);
return pre;
}
inline int next(int &root,int _key){
int x=0,y=0;
split(root,_key,x,y);
if(!y) return INF;
int nex=getval(y,1);
root=merge(x,y);
return nex;
}
int main(){
IO::read(n,m);
for(int i=1;i<=n;++i) IO::read(a[i].l,a[i].r);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;++i){
if(m){
m--,insert(root,a[i].r);
continue;
}
if(next(root,-INF)<=a[i].l){
del(root,next(root,-INF));
insert(root,a[i].r);
continue;
}
ans++;
if(prev(root,INF)>a[i].r){
del(root,prev(root,INF));
insert(root,a[i].r);
}
}
IO::write('\n',ans);
return 0;
}