#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=5e6+100;
const int inf=0x7fffffff;
struct dot{
int l,r;
bool operator < (const dot &hh)const{
if(r==hh.r)return l < hh.l;
return r < hh.r;
}
}s[N];
struct node{
int v,p;
int s[2];
int siz;
void init(int _v,int _p){
v=_v;
p=_p;
siz=1;
}
}t[N];
int tot;
int root;
void pushup(int x){
t[x].siz=t[t[x].s[0]].siz+t[t[x].s[1]].siz+1;
return ;
}
void rotate(int x){
int y=t[x].p;
int z=t[y].p;
int k=t[y].s[1]==x;
t[z].s[t[z].s[1]==y]=x;
t[x].p=z;
t[y].s[k]=t[x].s[k^1];
t[t[x].s[k^1]].p=y;
t[x].s[k^1]=y;
t[y].p=x;
pushup(y);
pushup(x);
return ;
}
void splay(int x,int k){
while(t[x].p!=k){
int y=t[x].p;
int z=t[y].p;
if(z!=k){
if((t[z].s[1]==y)^(t[y].s[1]==x))rotate(x);
else rotate(y);
}
rotate(x);
}
if(!k)root=x;
return ;
}
int insert(int v){
int u=root;
int p=0;
while(u){
p=u;
u=t[u].s[v>t[u].v];
}
u=++tot;
if(p)t[p].s[v>t[p].v]=u;
t[u].init(v,p);
splay(u,0);
return u;
}
void find(int v){
int u=root;
if(!u)return ;
while(t[u].s[v>t[u].v] && v!=t[u].v){
u=t[u].s[v>t[u].v];
}
splay(u,0);
return ;
}
int get_pre(int v){
find(v);
int u=root;
if(t[u].v<v)return u;
u=t[u].s[0];
while(t[u].s[1])u=t[u].s[1];
return u;
}
int get_nex(int v){
find(v);
int u=root;
if(t[u].v>v)return u;
u=t[u].s[1];
while(t[u].s[0])u=t[u].s[0];
return u;
}
void remove(int v){
int pre=get_pre(v);
int nex=get_nex(v);
splay(pre,0);
splay(nex,pre);
t[nex].s[0]=0;
return ;
}
int n,m;
int num[N];
int main(){
scanf("%d%d",&n,&m);
insert(-inf);
insert( inf);
for(int i=1;i<=m;i++)insert(0);
for(int i=1;i<=n;i++){
scanf("%d%d",&s[i].l,&s[i].r);
}
sort(s+1,s+n+1);
int ans=0;
for(int i=1;i<=n;i++){
int pre=get_pre(s[i].l+1);
int cnt=t[pre].v;
if(t[pre].v==-inf)ans++;
else{
remove(t[pre].v);
insert(s[i].r);
}
}
printf("%d\n",ans+1);
return 0;
}