#include<stdio.h>
#include<vector>
#include<cmath>
#include<algorithm>
#include<tuple>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef tuple<int,int,int> t3;

pii operator-(const pii &l, const pii &r){
	return pii(l.first - r.first, l.second - r.second);
}

int operator/(const pii &l, const pii &r){
	return l.first * r.second - l.second * r.first;
}

int sign(pii x){ return pii(0, 0) < x ? 1 : -1; }
double atan2(pii x){ return atan2(x.second, x.first); }

const int MX = 1<<18;
const int MM = 1000000007;

vector<int> G[MX];
int a, b;

struct node{
	node(int v, int mx):v(v), mx(mx){}
	node(){}
	int v, mx;
};

struct Tree{
	node t[MX*2];
	node merge(node l, node r){
		return node(l.v + r.v, max(l.v + r.mx, l.mx));
	}
	void update(int x, int v){
		x += MX;
		t[x].v += v; t[x].mx = v;
		while(x > 1){
			x /= 2;
			t[x] = merge(t[x*2], t[x*2+1]);
		}
	}
	int read(){ 
		return t[1].mx; 
	}
} tree;

int main()
{
	int N, M;
	scanf("%d%d", &N, &M);
	for(int i = 1; i <= N; i++){
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
	}
	int mx = max(0, N-M), cnt = 0;
	for(int i = 1; i <= M+1; i++) tree.update(i, 1);
	for(int i = 0; i <= M; i++){
		for(int c : G[i]){
			cnt++; 
			tree.update(c+1, -1);
		}
		mx = max(mx, tree.read()+cnt - M-i-1);
	}
	printf("%d\n", mx);
}
