#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
vector<int> pos[N];
int n, m;
struct segTree {
  int mx[N << 2], b[N << 2], add[N << 2];
  void Build(int l, int r, int rt) {
    add[rt] = 0;
    if (l == r) {
      mx[rt] = r - m - 1;
      return;
    }
    int m = (l + r) / 2;
    Build(l, m, rt << 1);
    Build(m + 1, r, rt << 1 | 1);
    mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);
  }
  void upd(int L, int R, int c, int l, int r, int rt) {
    if (L <= l && r <= R) {
      add[rt] += c;
      return;
    }
    int m = (l + r) / 2;
    if (L <= m) upd(L, R, c, l, m, rt << 1);
    if (R > m) upd(L, R, c, m + 1, r, rt << 1 | 1);
    mx[rt] =
        max(mx[rt << 1] + add[rt << 1], mx[rt << 1 | 1] + add[rt << 1 | 1]);
  }
  int qry(int L, int R, int l, int r, int rt) {
    if (L > R) return 0;
    if (L <= l && r <= R) {
      return mx[rt] + add[rt];
    }
    int m = (l + r) / 2;
    int ans = -1e8;
    if (L <= m) ans = max(ans, qry(L, R, l, m, rt << 1));
    if (R > m) ans = max(ans, qry(L, R, m + 1, r, rt << 1 | 1));
    return ans + add[rt];
  }
} sg;
int main() {
  cin >> n >> m;
  int l, r;
  for (int i = (1); i < (n + 1); i++) {
    cin >> l >> r;
    pos[l].push_back(r);
  }
  sg.Build(1, m + 1, 1);
  int ans = 0;
  for (int i = (0); i < (m + 1); i++) {
    for (auto v : pos[i]) {
      sg.upd(1, v, 1, 1, m + 1, 1);
    }
    ans = max(ans, sg.qry(1, m + 1, 1, m + 1, 1) - i);
  }
  cout << ans << "\n";
  return 0;
}
