#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1 << 17;
const int INF = 1 << 25;
const int def = -INF;
struct MaxSegTree2 {
  int n;
  long long segMax[2 * MAX_N - 1], segAdd[2 * MAX_N - 1];
  void init(int n_) {
    n = 1;
    while (n < n_) n *= 2;
    for (int i = 0; i < 2 * n - 1; i++) segMax[i] = 0, segAdd[i] = 0;
  }
  void add(int a, int b, long long x) { add(a, b, x, 0, 0, n); }
  void add(int a, int b, long long x, int k, int l, int r) {
    if (r <= a || b <= l) return;
    if (a <= l && r <= b) {
      segAdd[k] += x;
      return;
    }
    add(a, b, x, k * 2 + 1, l, (l + r) / 2);
    add(a, b, x, k * 2 + 2, (l + r) / 2, r);
    segMax[k] = max(segMax[k * 2 + 1] + segAdd[k * 2 + 1],
                    segMax[k * 2 + 2] + segAdd[k * 2 + 2]);
  }
  long long query(int a, int b) { return query(a, b, 0, 0, n); }
  long long query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return def;
    if (a <= l && r <= b) return segMax[k] + segAdd[k];
    long long vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    long long vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return max(vl, vr) + segAdd[k];
  }
} st;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N, M;
  cin >> N >> M;
  vector<pair<int, int> > p(N);
  for (int i = 0; i < N; i++) {
    cin >> p[i].first >> p[i].second;
  }
  sort(p.begin(), p.end());
  st.init(M + 10);
  for (int i = M; i >= 0; i--) {
    st.add(i, i + 1, -(M - i + 1));
  }
  auto f = [&] {
    for (int i = 0; i < M + 1; i++) {
      cout << st.query(i, i + 1) << " ";
    }
    cout << endl;
  };
  int ans = 0;
  for (int i = 0; i < N; i++) {
    int L = p[i].first, R = p[i].second;
    st.add(0, R + 1, 1);
    int sum = -L;
    sum += st.query(0, M + 10);
    ans = max(ans, sum);
  }
  cout << ans << endl;
}
