#include <bits/stdc++.h>
using namespace std;
const long double PI = acos((long double)-1.0);
template <class T>
void dbs(string str, T t) {
  cerr << str << " : " << t << "\n";
}
template <class T, class... S>
void dbs(string str, T t, S... s) {
  int idx = str.find(',');
  cerr << str.substr(0, idx) << " : " << t << ",";
  dbs(str.substr(idx + 1), s...);
}
template <class S, class T>
ostream& operator<<(ostream& os, const pair<S, T>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, const set<T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class S, class T>
ostream& operator<<(ostream& os, const map<S, T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class T>
void prc(T a, T b) {
  cerr << "[";
  for (T i = a; i != b; ++i) {
    if (i != a) cerr << ", ";
    cerr << *i;
  }
  cerr << "]\n";
}
typedef struct node2 {
  int val;
  int lazyp;
} node1;
node1 tree[800010];
vector<int> Adj[100010];
int n, m;
void build(int node, int b, int e) {
  if (b > e) return;
  if (b == e) {
    tree[node].val = b - (m + 1);
    tree[node].lazyp = 0;
    return;
  }
  build(2 * node, b, (b + e) / 2);
  build(2 * node + 1, (b + e) / 2 + 1, e);
  tree[node].val = max(tree[2 * node].val, tree[2 * node + 1].val);
  tree[node].lazyp = 0;
  return;
}
void push(int node, int b, int e) {
  if (tree[node].lazyp == 0) return;
  if (b != e) {
    tree[2 * node].lazyp += tree[node].lazyp;
    tree[2 * node + 1].lazyp += tree[node].lazyp;
  }
  tree[node].val += tree[node].lazyp;
  tree[node].lazyp = 0;
}
void update(int node, int b, int e, int i, int j, int val) {
  push(node, b, e);
  if (b > e || i > e || j < b) return;
  if (i <= b && e <= j) {
    tree[node].val += val;
    if (b != e) {
      tree[2 * node].lazyp += val, tree[2 * node + 1].lazyp += val;
    }
    return;
  }
  update(2 * node, b, (b + e) / 2, i, j, val);
  update(2 * node + 1, (b + e) / 2 + 1, e, i, j, val);
  tree[node].val =
      max(tree[node].val, max(tree[2 * node].val, tree[2 * node + 1].val));
}
void query(node1& res, int node, int b, int e, int i, int j) {
  push(node, b, e);
  if (b > e || i > e || j < b) return;
  if (i <= b && e <= j) {
    res = tree[node];
    return;
  }
  node1 l, r;
  l.val = r.val = -1e9;
  query(l, 2 * node, b, (b + e) / 2, i, j);
  query(r, 2 * node + 1, (b + e) / 2 + 1, e, i, j);
  res.val = max(l.val, r.val);
}
int main() {
  cin >> n >> m;
  for (int i = (int)(1); i <= (int)(n); i++) {
    int l1, r1;
    cin >> l1 >> r1;
    Adj[l1].push_back(r1);
  }
  build(1, 0, m + 1);
  int answer1 = n - m;
  for (int i = (int)(0); i <= (int)(m + 1); i++) {
    for (auto v : Adj[i]) {
      update(1, 0, m + 1, 0, v, 1);
    }
    node1 res;
    res.val = 0;
    query(res, 1, 0, m + 1, 0, m + 1);
    answer1 = max(answer1, res.val - i);
  }
  cout << answer1 << "\n";
  return 0;
}
