#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
inline void check_max(int a,int &b){if(a>b)b=a;}
priority_queue<int,vector<int>,greater<int>>Q;
const int N=201000;
pii s[N*3];
int f[N*2];
int n,m,tot,ans;
int main()
{
//	freopen("in","r",stdin);
	scanf("%d%d",&n,&m);
	tot=0;
	for(int i=1,x,y;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
//		if(x>0)s[++tot]=pii(1,x);
//		if(y<=m)s[++tot]=pii(y+m,m+m);
		x+=m;std::swap(x,y);
		if(x>y)continue;
		if(x<=0)x=1;
		s[++tot]=pii(x,y);
		if(x+m>y)s[++tot]=pii(x+m,std::min(y+m,m+m));
//		if(y-m<x)s[++tot]=pii(std::max(x-m,1),y-m);
	}
//	for(int i=1;i<=tot;i++)
//		printf("%d -- %d\n",s[i].x,s[i].y);
	std::sort(s+1,s+tot+1);
	ans=0;
	for(int i=1,ind=1,m2=m*2;i<=m2;i++)
	{
		while(s[ind].x<=i && ind<=tot)Q.push(s[ind].y),ind++;
		while(!Q.empty() && Q.top()<i)Q.pop();
		if(!Q.empty())ans++,Q.pop();
		f[i]=ans;
	}
//	for(int i=1;i<=m*2;i++)printf("%d ",f[i]);
//	printf("\n");
	ans=0;
	for(int i=m,m2=m*2;i<=m2;i++)
		check_max(f[i]-f[i-m],ans);
	printf("%d\n",n-ans);
	return 0;
}
