#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<cstdlib>
#include<ctime>
#define rep(i,j,k) for(register int i = j; i <= k; i++)
#define dow(i,j,k) for(register int i = j; i >= k; i--)
#define ll long long
using namespace std;
 
inline int read() {
	int s = 0, t = 1; char c = getchar();
	while( !isdigit(c) ) { if( c == '-' ) t = -1; c = getchar(); }
	while( isdigit(c) ) s = s * 10 + c - 48, c = getchar();
	return s * t;	
} 

const int N = 2e5+5;
int tot = 0, f[N];
struct node{ int x, y; bool operator < (const node&rhs) const { return x < rhs.x; } } A[N], B[N];
inline bool cmp1(const int&a,const int&b) { return a < b; }
priority_queue<int,vector<int>,greater<int> > q;

int main() {
	int n = read(), m = read(), cnt = 0;
	rep(i,1,n) A[i].x = read(), A[i].y = read();
	sort(A+1,A+n+1);
	rep(i,1,n) { 
		if( q.size() >= A[i].x ) { 
			if( !A[i].x ) f[++tot] = A[i].y;
			else { 
				if( q.top() < A[i].y ) f[++tot] = q.top(), q.pop(), q.push(A[i].y);
				else f[++tot] = A[i].y;
			}
		} else q.push(A[i].y);
	}
	cnt = q.size();
	rep(i,1,tot) f[i] = m + 1 - f[i];
	sort(f+1,f+tot+1);
	int ret = 0;
	rep(i,1,tot) { 
		if( ret + 1 <= min(f[i],m-cnt) ) ret++;
	}
	cout<<n-(ret+cnt)<<endl;
    return 0;
} 