#include<bits/stdc++.h>
using namespace std;
struct tree
{
	int addv[770001],maxv[770001];
	void build(int o,int l,int r,int n)
	{
		if(l==r){maxv[o]=-(n-l+1);return;}
		int m=(l+r)/2;
		build(o*2,l,m,n);
		build(o*2+1,m+1,r,n);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	}
	void add(int o,int d){addv[o]+=d;maxv[o]+=d;}
	void pushdown(int o,int l,int r)
	{
		if(l==r||!addv[o])return;
		add(o*2,addv[o]);
		add(o*2+1,addv[o]);
		addv[o]=0;
	}
	void add(int x,int y,int d,int o,int l,int r)
	{
		if(x<=l&&r<=y)return add(o,d);
		pushdown(o,l,r);
		int m=(l+r)/2;
		if(x<=m)add(x,y,d,o*2,l,m);
		if(y>m)add(x,y,d,o*2+1,m+1,r);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	}
	int query(int x,int y,int o,int l,int r)
	{
		if(x<=l&&r<=y)return maxv[o];
		pushdown(o,l,r);
		int m=(l+r)/2,ans=0;
		if(x<=m)ans=max(ans,query(x,y,o*2,l,m));
		if(y>m)ans=max(ans,query(x,y,o*2+1,m+1,r));
		return ans;
	}
}T;
int n,m;
vector<int> v[330001];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,l,r;i<=n;i++)scanf("%d%d",&l,&r),v[l].push_back(r);
	T.build(1,0,m+1,m);
	int ans=n-m;
	for(int i=0;i<=m;i++)
	{
		for(int j:v[i])T.add(0,j,1,1,0,m+1);
		ans=max(ans,T.query(i+1,m+1,1,0,m+1)-i);
	}
	printf("%d\n",ans);
}
