#include <bits/stdc++.h>
using namespace std;
struct tree {
  int addv[770001], maxv[770001];
  void build(int o, int l, int r, int n) {
    if (l == r) {
      maxv[o] = -(n - l + 1);
      return;
    }
    int m = (l + r) / 2;
    build(o * 2, l, m, n);
    build(o * 2 + 1, m + 1, r, n);
    maxv[o] = max(maxv[o * 2], maxv[o * 2 + 1]);
  }
  void add(int o, int d) {
    addv[o] += d;
    maxv[o] += d;
  }
  void pushdown(int o, int l, int r) {
    if (l == r || !addv[o]) return;
    add(o * 2, addv[o]);
    add(o * 2 + 1, addv[o]);
    addv[o] = 0;
  }
  void add(int x, int y, int d, int o, int l, int r) {
    if (x <= l && r <= y) return add(o, d);
    pushdown(o, l, r);
    int m = (l + r) / 2;
    if (x <= m) add(x, y, d, o * 2, l, m);
    if (y > m) add(x, y, d, o * 2 + 1, m + 1, r);
    maxv[o] = max(maxv[o * 2], maxv[o * 2 + 1]);
  }
  int query(int x, int y, int o, int l, int r) {
    if (x <= l && r <= y) return maxv[o];
    pushdown(o, l, r);
    int m = (l + r) / 2, ans = 0;
    if (x <= m) ans = max(ans, query(x, y, o * 2, l, m));
    if (y > m) ans = max(ans, query(x, y, o * 2 + 1, m + 1, r));
    return ans;
  }
} T;
struct range {
  int l, r;
} a[330001];
int n, m;
vector<int> v[330001];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, l, r; i <= n; i++) {
    scanf("%d%d", &l, &r);
    l = max(l, 1);
    r = min(r, m);
    v[l].push_back(r);
  }
  T.build(1, 1, m, m);
  int ans = n - m;
  for (int i = 1; i <= m; i++) {
    for (int j : v[i]) T.add(1, j, 1, 1, 1, m);
    ans = max(ans, T.query(i, m, 1, 1, m) - i);
  }
  printf("%d\n", ans);
}
