#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
using namespace std;
const long long N = 2e5 + 100;
long long long long seg[N * 4];
void build(long long long long nod, long long long long l,
           long long long long r) {
  seg[nod] = l;
  if (r - l == 1) return;
  long long long long mid = (r + l) / 2;
  build(nod * 2, l, mid);
  build(nod * 2 + 1, mid, r);
  return;
}
void upd(long long long long nod, long long long long l, long long long long r,
         long long long long id) {
  if (r - l == 1) {
    seg[nod] = N + 10;
    return;
  }
  long long long long mid = (r + l) / 2;
  if (mid > id)
    upd(nod * 2, l, mid, id);
  else
    upd(nod * 2 + 1, mid, r, id);
  seg[nod] = min(seg[nod * 2], seg[nod * 2 + 1]);
}
long long long long get(long long long long nod, long long long long l,
                        long long long long r, long long long long L,
                        long long long long R) {
  if (l >= R || L >= r) return N + 100;
  if (l >= L && r <= R) return seg[nod];
  long long long long mid = (r + l) / 2;
  return min(get(nod * 2, l, mid, L, R), get(nod * 2 + 1, mid, r, L, R));
}
int32_t main() {
  long long long long n, m;
  cin >> n >> m;
  vector<pair<long long, long long> > a;
  for (long long i = 1; i <= n; i++) {
    long long long long l, r;
    cin >> l >> r;
    a.push_back({l, r});
  }
  sort(a.begin(), a.end());
  long long long long ans = 0;
  vector<long long> c;
  build(1, 1, m + 1);
  for (long long i = 0; i < a.size(); i++) {
    long long long long l = a[i].first, r = a[i].second;
    long long long long z = get(1, 1, m + 1, r, m + 1);
    if (z > m) {
      c.push_back(l);
    } else {
      ans++;
      upd(1, 1, m + 1, z);
    }
  }
  sort(c.begin(), c.end());
  long long long long cnt = 1;
  for (long long i = 0; i < c.size(); i++) {
    long long long long z = get(1, 1, m + 1, cnt, cnt + 1);
    if (z > m) break;
    if (c[i] >= cnt) {
      ans++;
      cnt++;
    }
  }
  cout << n - ans;
}
