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

const int N = 200005;

int T[N << 2], lz[N << 2];

// SEGMENT TREE
#define mid ((l + r) >> 1)
void push(int v, int l, int r) {
	if (lz[v] == 0) return;
	if (l < r) lz[v << 1] += lz[v], lz[v << 1 | 1] += lz[v];
	T[v] += lz[v];
	lz[v] = 0;
}

void upd(int v, int l, int r, int L, int R, int val) {
	push(v, l, r);
	if (l > r || R < l || L > r) return;
	if (L <= l && r <= R) { lz[v] = val; push(v, l, r); return; }
	upd(v << 1, l, mid, L, R, val); upd(v << 1 | 1, mid + 1, r, L, R, val);
	T[v] = max(T[v << 1], T[v << 1 | 1]);
}

int get(int v, int l, int r, int L, int R) {
	push(v, l, r);
	if (l > r || R < l || L > r) return 0;
	if (L <= l && r <= R) return T[v];
	return max(get(v << 1, l, mid, L, R), get(v << 1 | 1, mid + 1, r, L, R));
}
#undef mid
// END OF SEGMENT TREE

int n, m;
vector<int> seg[N];
int ans;

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		int l, r; cin >> l >> r;
		seg[r].push_back(l);
	}

	for (int i = 1; i <= m; ++i) upd(1, 0, m + 1, i, i, -i);

	for (int rig = m + 1; rig >= 1; --rig) {
		for (int lef : seg[rig]) {
			upd(1, 0, m + 1, lef, m + 1, +1);
		}
		int mx = get(1, 0, m + 1, 0, rig - 1);
		//cerr << rig << ' ' << mx << endl;
		ans = max(ans, mx - m - 1 + rig);
	}

	cout << max(ans, n - m) << endl;
}