#include<bits/stdc++.h>
using namespace std;
const int N=200005,INF=0x3f3f3f3f;

struct E{
	int f,t,capa,flow,xt;
}e[N<<5];

int h[N<<2],cnt;

inline void adge(int f,int t,int capa){
//	if(cnt>400000) puts("g2g");
	e[++cnt]=(E){f,t,capa,0,h[f]};h[f]=cnt;
	e[++cnt]=(E){t,f,0,0,h[t]};h[t]=cnt;
}

int d[N<<2],num[N<<2],cur[N<<2],p[N<<2];

int ISAP(int s,int t,int n){
	for(int i=0;i<=n;i++) cur[i]=h[i],d[i]=INF;
	queue<int>q;
	q.push(t),d[t]=0;
	int flow=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=h[u];~i;i=e[i].xt) if(d[e[i].t]==INF) num[d[e[i].t]=d[u]+1]++,q.push(e[i].t);
	}
	for(int x=s,ok=0;d[s]<n;ok=0){
	//	puts("gg");
		if(x==t){
			int a=INF;
			for(;x!=s;x=e[p[x]].f) a=min(e[p[x]].capa-e[p[x]].flow,a);
			for(x=t,flow+=a;x!=s;x=e[p[x]].f) e[p[x]].flow+=a,e[p[x]^1].flow-=a;
		}
		for(int i=cur[x];~i;i=e[i].xt)
			if(e[i].capa>e[i].flow&&d[e[i].t]==d[x]-1){
				ok=1;
				cur[x]=i;
				p[x=e[i].t]=i;
				break;
			}
		if(!ok){
			int m=n-1;
			for(int i=cur[x]=h[x];~i;i=e[i].xt) if(e[i].capa>e[i].flow) m=min(m,d[e[i].t]);
			if(--num[d[x]]==0) break;
			num[d[x]=m+1]++;
			if(x!=s) x=e[p[x]].f;
		}
	}
	return flow;
}

int ct=1,ls[N<<2],rs[N<<2];

void build(int&o,int L,int R){
//	puts("gg");
	o=++ct;
	if(L==R){
		adge(o,1,1);
	}else{
		int M=L+R>>1;
		build(ls[o],L,M);
		build(rs[o],M+1,R);
		adge(o,ls[o],INF);
		adge(o,rs[o],INF);
	}
}

void add(int o,int L,int R,int l,int r,int x){
//	printf("L,R=%d %d l,r=%d %d\n",L,R,l,r);
//	system("pause");
	if(l<=L&&r>=R){
		adge(x,o,INF);
	}else{
		int M=L+R>>1;
		if(l<=M) add(ls[o],L,M,l,r,x);
		if(r>M) add(rs[o],M+1,R,l,r,x);
	}
}


int main(){
	
	//freopen("in","r",stdin);
	
	memset(h,cnt=-1,sizeof(h));
	int n,m;
	scanf("%d%d",&n,&m);
	int rt;
	build(rt,1,m);
	for(int i=1;i<=n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		add(rt,1,m,1,max(a,1),ct+i);
		add(rt,1,m,min(b,m),m,ct+i);
	}
	for(int i=1;i<=n;i++) adge(0,ct+i,1);	

//	puts("edge");
//	for(int i=0;i<=cnt;i++) printf("%d %d\n",e[i].f,e[i].t);	
	
	printf("%d\n",n-ISAP(0,1,n+ct+1));
	return 0;
}
