#include <bits/stdc++.h>
using namespace std;
struct P {
  int l, r;
} b[1000000];
struct node {
  int l, r, mx, tag;
} a[1000000];
inline void down(int o) {
  a[o].mx += a[o].tag;
  if (a[o].l != a[o].r) a[o + o].tag += a[o].tag, a[o + o + 1].tag += a[o].tag;
  a[o].tag = 0;
}
inline void update(int o) {
  if (a[o + o].tag) down(o + o);
  if (a[o + o + 1].tag) down(o + o + 1);
  a[o].mx = max(a[o + o].mx, a[o + o + 1].mx);
}
void build(int l, int r, int o) {
  a[o].l = l;
  a[o].r = r;
  if (l == r) {
    a[o].mx = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, o + o);
  build(mid + 1, r, o + o + 1);
  update(o);
}
void add(int l, int r, int o) {
  if (a[o].tag) down(o);
  if (a[o].l == l && a[o].r == r) {
    a[o].tag++, down(o);
    return;
  }
  int mid = (a[o].l + a[o].r) >> 1;
  if (r <= mid)
    add(l, r, o + o);
  else if (l > mid)
    add(l, r, o + o + 1);
  else
    add(l, mid, o + o), add(mid + 1, r, o + o + 1);
  update(o);
}
int query(int l, int r, int o) {
  if (a[o].tag) down(o);
  if (a[o].l == a[o].r) return a[o].mx;
  int mid = (a[o].l + a[o].r) >> 1;
  if (r <= mid)
    return query(l, r, o + o);
  else if (l > mid)
    return query(l, r, o + o + 1);
  else
    return max(query(l, mid, o + o), query(mid + 1, r, o + o + 1));
}
inline bool cmp(P x, P y) { return x.l < y.l; }
int main() {
  int n, m, ans;
  cin >> n >> m;
  ans = max(0, n - m);
  for (register int i = 1; i <= n; i++) scanf("%d%d", &b[i].l, &b[i].r);
  sort(b + 1, b + n + 1, cmp);
  int p = 1;
  build(1, m + 1, 1);
  for (register int i = 0; i <= m; i++) {
    for (; p <= n && b[p].l == i; p++) add(1, b[p].r, 1);
    ans = max(ans, query(i + 1, m + 1, 1) - i - m - 1);
  }
  cout << ans;
  return 0;
}
