#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=200005;
struct node { int l,r; } v[N];
int s[N],i,j,k,n,m,z,an,R;
char c;

inline char getc()
{
	#define VV 10000000
	static char s[VV],*l=s,*r=s;
	if (l==r)
		l=s,r=s+fread(s,1,VV,stdin);
	return l==r?0:*l++;
}

int read(){ int z=0; do c=getc(); while (c<'0'||c>'9'); while (c>='0'&&c<='9') z*=10,z+=c-'0',c=getc(); return z; }

bool cmp(node a,node b){ return a.l<b.l; }

priority_queue <int,vector<int>, greater <int> > q;

void solve()
{
	n=read(),m=read();
	for (i=1;i<=n;++i) v[i]=(node){read(),read()},++s[v[i].r];
	sort(v+1,v+n+1,cmp),v[n+1].l=m+1;
	for (j=1;!v[j].l;++j);
	for (i=1;j<=n;++j)
	{
		if (i<=v[j].l)
			++i,++an,--s[v[j].r],q.push(v[j].r);
		else
		{
			z=q.top();
			if (z<v[j].r)
				++s[z],q.pop(),--s[v[j].r],q.push(v[j].r);
		}
	}
	R=i-1;
	for (i=j=m;j;--j)
		z=min(s[j],i-max(R,j-1)),
		i-=z,an+=z;
}

int main()
{
	solve();
	printf("%d\n",n-an);
	return 0;
}