#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <memory.h>
#include <queue>

using namespace std;
const int maxn = 800005;

struct node {int l,r;}p[maxn];
int n,m,ans;
bool comp(node a,node b) {
	return a.l<b.l;
}
namespace ST {
	#define ls rt<<1
	#define rs rt<<1|1
	int tag[maxn],maxv[maxn];
	void update(int rt) {maxv[rt]=max(maxv[ls],maxv[rs]);}
	void add(int rt,int v) {maxv[rt]+=v;tag[rt]+=v;}
	void pushdown(int rt) {
		if (int v=tag[rt]) {
			add(ls,v);add(rs,v);tag[rt]=0;
		}
	}
	void build(int rt,int L,int R)
	{
		maxv[rt]=R-m-1;
		if (L>=R) return ;
		int mid=L+R>>1;
		build(ls,L,mid);build(rs,mid+1,R);
		update(rt);
	}
	void modify(int rt,int L,int R,int l,int r)
	{
		if (L>=l&&R<=r) {add(rt,1);return ;}
		int mid=L+R>>1;pushdown(rt);
		if (l<=mid) modify(ls,L,mid,l,r);
		if (r>mid) modify(rs,mid+1,R,l,r);
		update(rt);
	}
}
using namespace ST ;

int main()
{
	#ifdef LOCAL_JUDGE
		freopen("exhausted.in","r",stdin);
		freopen("exhausted.out","w",stdout);
	#endif
	scanf("%d %d",&n,&m);ans=max(0,n-m);
	for (int i=1;i<=n;i++)
		scanf("%d %d",&p[i].l,&p[i].r);
	sort(p+1,p+n+1,comp);build(1,0,m+1);
	for (int j=1,i=0;i<=m;i++)
	{
		while (j<=n&&p[j].l<=i) {
			modify(1,0,m+1,0,p[j].r);++j;
		}
		ans=max(ans,maxv[1]-i);
	}
	printf("%d",ans);
	return 0;
}