#include <bits/stdc++.h>
using namespace std;

template <typename _tp> inline void read(_tp&x){
	char ch=getchar();x=0;while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
}

const int N = 601000;
int sg[N], tag[N];

vector <int> vec[N];
vector <int> :: iterator itr;

void build(int l, int r, int x) {
	sg[x] = -l;
	if(l == r) return ;
	int mid = l + r >> 1;
	build(l, mid, x<<1);
	build(mid+1, r, x<<1|1);
}

inline void down(int x) {
	int&v = tag[x];
	sg[x<<1] += v, tag[x<<1|1] += v,
	sg[x<<1|1] += v, tag[x<<1] += v,
	v = 0;
}

void upd(int l, int r, int x, int L) {
	if(L <= l) return ++sg[x], ++tag[x], void();
	int mid = l + r >> 1; if(tag[x]) down(x);
	if(L <= mid) upd(l, mid, x<<1, L);
	upd(mid+1, r, x<<1|1, L);
	sg[x] = max(sg[x<<1], sg[x<<1|1]);
}

int qry(int l, int r, int x, int R) {
	if(r <= R) return sg[x];
	if(tag[x]) down(x);
	int mid = l + r >> 1, res = qry(l, mid, x<<1, R);
	if(mid < R) res = max(res, qry(mid+1, r, x<<1|1, R));
	return res;
}

int n, m;

int main() {
	read(n), read(m);
	for(int i=1,l,r;i<=n;++i) {
		read(l), read(r);
		vec[r].push_back(l);
	}
	
	build(0, m, 1);
	
	int Ans = m;
	for(int r=m+1;r>1;--r) {
		for(itr = vec[r].begin(); itr != vec[r].end(); ++ itr)
			upd(0, m, 1, *itr);
		Ans = max(Ans, qry(0,m,1,r-1) + r - 1);
	}
	Ans = max(Ans, n);
	printf("%d\n", Ans-m);
	return 0;
}