#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const long long llinf = 0x3f3f3f3f3f3f3f3f;
template <typename INint>
inline void IN(INint &first) {
  first = 0;
  int f = 1;
  char c;
  cin.get(c);
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    cin.get(c);
  }
  while (c >= '0' && c <= '9') {
    first = first * 10 + c - '0';
    cin.get(c);
  }
  first *= f;
}
template <typename INint>
inline void OUT(INint first) {
  if (first > 9) OUT(first / 10);
  cout.put(first % 10 + '0');
}
const int maxn = int(2e5 + 5);
struct node {
  int l, r;
  long long ma;
  long long lazy;
};
node e[maxn << 2];
inline void PushUp(int &o) {
  e[o].ma = max(e[(o << 1)].ma, e[(o << 1 | 1)].ma);
}
void build(int o, int l, int r) {
  e[o].l = l;
  e[o].r = r;
  e[o].lazy = 0;
  if (l == r) {
    e[o].ma = e[o].r;
    return;
  }
  build((o << 1), l, ((e[o].l + e[o].r) >> 1));
  build((o << 1 | 1), ((e[o].l + e[o].r) >> 1) + 1, r);
  PushUp(o);
}
void S_T(int o, long long inc) {
  e[o].ma += inc;
  e[o].lazy += inc;
}
inline void PushDown(int &o) {
  if (!e[o].lazy) return;
  S_T((o << 1), e[o].lazy);
  S_T((o << 1 | 1), e[o].lazy);
  e[o].lazy = 0;
}
void update(int o, int l, int r, int v) {
  if (l > r) return;
  if (e[o].l == l && e[o].r == r) {
    S_T(o, v);
    return;
  }
  PushDown(o);
  update((o << 1), max(e[(o << 1)].l, l), min(r, ((e[o].l + e[o].r) >> 1)), v);
  update((o << 1 | 1), max(((e[o].l + e[o].r) >> 1) + 1, l),
         min(e[(o << 1 | 1)].r, r), v);
  PushUp(o);
}
void update2(int o, int l, int r, int v) {
  if (l <= e[o].l && e[o].r <= r) {
    S_T(o, v);
    return;
  }
  if (max(l, e[o].l) > min(r, e[o].r)) return;
  PushDown(o);
  update2((o << 1), l, r, v);
  update2((o << 1 | 1), l, r, v);
  PushUp(o);
}
long long query(int o, int l, int r) {
  if (l > r) return 0;
  if (e[o].l == l && e[o].r == r) return e[o].ma;
  PushDown(o);
  PushUp(o);
  return max(
      query((o << 1), max(l, e[(o << 1)].l), min(r, ((e[o].l + e[o].r) >> 1))),
      query((o << 1 | 1), max(l, ((e[o].l + e[o].r) >> 1) + 1),
            min(r, e[(o << 1 | 1)].r)));
}
vector<int> R[maxn];
int main() {
  int T(1), times(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  while (++times, T--) {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= int(n); i++) {
      int l, r;
      cin >> l >> r;
      R[l].push_back(r);
    }
    build(1, 0, m + 1);
    int mis = 0;
    for (int i = 0; i <= int(m + 1); ++i) {
      for (auto r : R[i]) {
        update(1, 0, r, 1);
      }
      if (i != m + 1) {
        int res = query(1, i + 1, m + 1);
        mis = max(mis, res - m - i - 1);
      }
    }
    int ans = mis;
    if (mis != max(mis, n - m)) ans = mis;
    cout << ans << endl;
  }
  return 0;
}
