#include<algorithm>
#include<stdio.h>
#include<string.h>
#define cmin(x,y) ((y)<x?x=(y):x)
#define cmax(x,y) ((y)>x?x=(y):x)
#define dmin(x,y) ((x)<(y)?(x):(y))
#define dmax(x,y) ((x)>(y)?(x):(y))
int F() {
	register int a,b,c;
	while(c=getchar(),c!='-'&&(c<'0'||c>'9'));
	b = (c=='-');
	for(a=b?0:c-'0';c=getchar(),c>='0'&&c<='9';a=a*10+c-'0');
	return b?-a:a;
}
const int N=2e5+1;
int n,m,head[N],pr[N],next[N],seg[1<<19],add[1<<19],qr;
void build(register int i,register int l,register int r) {
	seg[i]=r;
	if(l<r) {
		register int m=(l+r)>>1;
		build(i<<1,l,m);
		build(i<<1|1,m+1,r);
	}
}
#define addtag(x, v) (add[x]+=v, seg[x]+=v)
void modify(register int i,register int l,register int r) {
	if(l>qr) return;
	if(r<=qr) {addtag(i, 1); return;}
	if(add[i]) {
		addtag(i<<1  , add[i]);
		addtag(i<<1|1, add[i]);
		add[i]=0;
	}
	register int m=(l+r)>>1;
	modify(i<<1,l,m);
	modify(i<<1|1,m+1,r);
	seg[i]=dmax(seg[i<<1],seg[i<<1|1]);
}
int main() {
	register int i,j,ans=0;
	n=F(),m=F();
	for(i=1;i<=n;++i) {
		j=F(), pr[i]=F();
		next[i]=head[j];
		head[j]=i;
	}
	build(1,0,m+1);
	for(i=0;i<=m+1;++i) {
		for(j=head[i];j;j=next[j]) {
			qr=pr[j];
			modify(1,0,m+1);
		}
		cmax(ans,seg[1]-i);
	}
	ans=n+m+1-ans;
	//debug: maybe all the edges in the seats' set is cut.
	cmin(ans,m);
	printf("%d\n",dmax(n-ans,0));
	return 0;
}