#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const int oo = 0x3f3f3f3f;
int N, M, ans = 0;
vector<int> upper[MAXN];
namespace Seg {
struct tree {
  int mk, mx;
} t[MAXN << 2];
void rel(int k) { t[k].mx = max(t[k << 1].mx, t[k << 1 | 1].mx); }
void mark(int k, int mk) {
  t[k].mk += mk;
  t[k].mx += mk;
}
void Pushdown(int k) {
  if (!t[k].mk) return;
  mark(k << 1, t[k].mk);
  mark(k << 1 | 1, t[k].mk);
  t[k].mk = 0;
}
void Build(int le, int ri, int k) {
  if (le == ri) {
    t[k].mx = -(M - le + 1);
    return;
  }
  int mi = (le + ri) >> 1;
  Build(le, mi, k << 1);
  Build(mi + 1, ri, k << 1 | 1);
  rel(k);
}
void Modify(int le, int ri, int k, int l, int r, int v) {
  if (le != ri) Pushdown(k);
  if (l <= le && ri <= r) {
    mark(k, v);
    return;
  }
  int mi = (le + ri) >> 1;
  if (l <= mi) Modify(le, mi, k << 1, l, r, v);
  if (mi + 1 <= r) Modify(mi + 1, ri, k << 1 | 1, l, r, v);
  rel(k);
}
int Query(int le, int ri, int k, int l, int r) {
  if (le != ri) Pushdown(k);
  if (l <= le && ri <= r) return t[k].mx;
  int mi = (le + ri) >> 1, mx = -oo;
  if (l <= mi) mx = max(mx, Query(le, mi, k << 1, l, r));
  if (mi + 1 <= r) mx = max(mx, Query(mi + 1, ri, k << 1 | 1, l, r));
  return mx;
}
}  // namespace Seg
using namespace Seg;
namespace solution {
void Prepare() {
  scanf("%d%d", &N, &M);
  ans = max(ans, N - M);
  for (int i = 1; i <= N; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    upper[l].push_back(r);
  }
  Build(0, M + 1, 1);
}
void Solve() {
  for (int i = 0; i <= M; i++) {
    for (int j = 0; j <= (int)upper[i].size() - 1; j++)
      Modify(0, M + 1, 1, 1, upper[i][j], 1);
    ans = max(ans, Query(0, M + 1, 1, i + 1, M) - i);
  }
  cout << ans << endl;
}
}  // namespace solution
int main() {
  using namespace solution;
  Prepare();
  Solve();
  return 0;
}
