#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
const int N = 2e5 + 5; 
using namespace std;

int n, m, cntl, cntr, stk[N], top;
struct node { int l, r; } p[N]; 
priority_queue<int, vector<int>, greater<int> > q; 

template < typename T >
inline T read()
{
	T x = 0, w = 1; char c = getchar();
	while(c < '0' || c > '9') { if(c == '-') w = -1; c = getchar(); }
	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
	return x * w; 
}

bool cmp(node a, node b) { return a.l < b.l; }

int main()
{
#ifndef ONLINE_JUDGE
	freopen("cpp.in", "r", stdin); 
#endif
	n = read <int> (), m = read <int> ();
	for(int i = 1; i <= n; i++) p[i].l = read <int> (), p[i].r = read <int> ();
	sort(p + 1, p + n + 1, cmp); 
	for(int i = 1; i <= n; i++)
	{
		if(cntl < p[i].l) cntl++, q.push(p[i].r); 
		else
		{
			if(q.empty()) stk[++top] = p[i].r; 
			else if(p[i].r > q.top())
				stk[++top] = q.top(), q.pop(), q.push(p[i].r);
			else stk[++top] = p[i].r; 
		}
	}
	sort(stk + 1, stk + top + 1); 
	for(int i = top; i >= 1; i--)
	{
		if(cntr + cntl == m) continue; 
		if(cntr < m - stk[i] + 1) cntr++; 
	}
	printf("%d\n", n - cntl - cntr); 
	return 0; 
}
