#include <bits/stdc++.h>
template <typename A, typename B>
inline char smax(A &a, const B &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename A, typename B>
inline char smin(A &a, const B &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename I>
inline void read(I &x) {
  int f = 0, c;
  while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
  x = c & 15;
  while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
  f ? x = -x : 0;
}
const int N = 2e5 + 7;
int n, m;
std::vector<int> a[N];
namespace SGT {
struct Node {
  int add, max;
} t[N << 2];
int a[N];
inline void build(int o, int L, int R) {
  t[o].add = 0;
  if (L == R) return (void)(t[o].max = a[L]);
  int M = (L + R) >> 1;
  build(o << 1, L, M);
  build(o << 1 | 1, M + 1, R);
  t[o].max = std::max(t[o << 1].max, t[o << 1 | 1].max);
}
inline void pushdown(int o) {
  if (!t[o].add) return;
  t[o << 1].add += t[o].add, t[o << 1].max += t[o].add;
  t[o << 1 | 1].add += t[o].add, t[o << 1 | 1].max += t[o].add;
  t[o].add = 0;
}
inline void pushup(int o) {
  t[o].max = std::max(t[o << 1].max, t[o << 1 | 1].max);
  t[o].max += t[o].add;
}
inline void qadd(int o, int L, int R, int l, int r, int k) {
  if (l <= L && R <= r) return (void)(t[o].add += k, t[o].max += k);
  int M = (L + R) >> 1;
  pushdown(o);
  if (l <= M) qadd(o << 1, L, M, l, r, k);
  if (r > M) qadd(o << 1 | 1, M + 1, R, l, r, k);
  pushup(o);
}
inline int qmax(int o, int L, int R, int l, int r) {
  if (l <= L && R <= r) return t[o].max;
  int M = (L + R) >> 1;
  pushdown(o);
  if (r <= M) return qmax(o << 1, L, M, l, r);
  if (l > M) return qmax(o << 1 | 1, M + 1, R, l, r);
  return std::max(qmax(o << 1, L, M, l, r), qmax(o << 1 | 1, M + 1, R, l, r));
}
}  // namespace SGT
using SGT::build;
using SGT::qadd;
using SGT::qmax;
inline void work() {
  ++n;
  for (int i = 0; i <= n; ++i) SGT::a[i] = i - n;
  build(1, 0, n);
  int ans = 0;
  for (int i = 0; i <= n; ++i) {
    for (auto j : a[i]) qadd(1, 0, n, 1, j, 1);
    smax(ans, qmax(1, 0, n, i + 1, n) - i);
  }
  printf("%d\n", ans);
}
inline void init() {
  read(m), read(n);
  for (int i = 1; i <= m; ++i) {
    int l, r;
    read(l), read(r);
    a[l].push_back(r);
  }
}
int main() {
  init();
  work();
  fclose(stdin), fclose(stdout);
  return 0;
}
