#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class A, size_t N, class T>
void Fill(A (&a)[N], const T &v) {
  fill((T *)a, (T *)(a + N), v);
}
const long long int INF = 1e9 + 7;
template <typename T>
struct node {
  T v, lazy;
  node() {
    v = INF;
    lazy = 0;
  }
  void merge(T vl, T vr) { v = min(vl, vr); }
  T add(int l, int r, T _v = 0) {
    T sum = lazy + _v;
    v += sum;
    lazy = 0;
    return sum;
  }
  void addLazy(T v) { lazy += v; }
};
template <typename T, typename NODE = node<T> >
class SegTree {
  void propLazy(int a, int b, int k, T v = 0) {
    T lazy = data[k].add(a, b, v);
    if (k < N) {
      data[k * 2 + 0].addLazy(lazy);
      data[k * 2 + 1].addLazy(lazy);
    }
  }
  T prop(int l, int r, T v, int a, int b, int k = 1) {
    propLazy(a, b, k);
    NODE nd;
    if (l <= a && b <= r) {
      propLazy(a, b, k, v);
      return data[k].v;
    } else if (l < b && a < r) {
      int m = (a + b) / 2;
      T vl = prop(l, r, v, a, m, k * 2);
      T vr = prop(l, r, v, m, b, k * 2 + 1);
      data[k].merge(data[k * 2].v, data[k * 2 + 1].v);
      nd.merge(vl, vr);
    }
    return nd.v;
  }

 public:
  vector<NODE> data;
  int N;
  SegTree(int _N) {
    N = 1;
    while (N < _N) N <<= 1;
    data.resize(N * 2);
  }
  void update(int l, T v) { prop(l, l + 1, v - get(l), 0, N); }
  T add(int l, int r, T v) { return prop(l, r, v, 0, N); }
  T get(int l, int r) { return prop(l, r, 0, 0, N); }
  T get(int l) { return prop(l, l + 1, 0, 0, N); }
};
int main() {
  int N, M, ans = 0;
  vector<pair<int, int> > v;
  cin >> N >> M;
  for (int i = 0; i < (N); i++) {
    int L, R;
    cin >> L >> R;
    v.emplace_back(R, L);
  }
  sort((v).begin(), (v).end());
  reverse((v).begin(), (v).end());
  SegTree<long long int> sg(M + 5);
  for (int i = 0; i < (M); i++) sg.update(i + 1, i + 1);
  vector<pair<int, int> > late;
  for (auto t : v) {
    int R = t.first;
    int L = t.second;
    if (sg.get(L, M + 2) > 0) {
      sg.add(L, M + 2, -1);
    } else {
      late.push_back(t);
    }
  }
  sort((late).begin(), (late).end());
  int pos = 0;
  for (auto t : late) {
    int R = t.first;
    int L = t.second;
    while (true) {
      if (pos <= M && R <= pos && sg.get(pos, M + 2) > 0) {
        sg.add(pos, M + 2, -1);
        pos++;
      } else if (pos < M) {
        pos++;
        continue;
      } else {
        ans++;
      }
      break;
    }
  }
  cout << ans << endl;
  return 0;
}
