#include <bits/stdc++.h>
using namespace std;
int n, v0, f[200012], nu = 0;
struct eve {
  int x, v, l;
  inline bool operator<(const eve &b) const {
    return (x < b.x) || ((x == b.x) && (v < b.v));
  }
};
multiset<eve> s;
inline void cha(int x, int v) {
  f[x] = v;
  if (v + v0 <= 1e9) s.insert((eve){v + v0, 0, -1});
}
int d[200012 << 2], ma[200012 << 2];
inline void Add(int p, int v) {
  d[p] += v;
  ma[p] += v;
}
inline void pd(int x) {
  if (d[x]) {
    Add(x << 1, d[x]);
    Add(x << 1 | 1, d[x]);
    d[x] = 0;
  }
}
void build(int p, int l, int r) {
  ma[p] = r;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
}
void change(int p, int l, int r, int L, int R, int v) {
  if ((R < l) || (r < L)) return;
  if ((L <= l) && (r <= R)) {
    Add(p, v);
    return;
  }
  pd(p);
  int mid = (l + r) >> 1;
  change(p << 1, l, mid, L, R, v);
  change(p << 1 | 1, mid + 1, r, L, R, v);
  ma[p] = max(ma[p << 1], ma[p << 1 | 1]);
}
int Ask(int p, int l, int r, int L, int R) {
  if ((R < l) || (r < L)) return 0;
  if ((L <= l) && (r <= R)) return ma[p];
  pd(p);
  int mid = (l + r) >> 1;
  return max(Ask(p << 1, l, mid, L, R), Ask(p << 1 | 1, mid + 1, r, L, R));
}
int main() {
  scanf("%d%d", &n, &v0);
  int i, l, r, x, o;
  eve p;
  memset(f, 0x3f, sizeof(f));
  build(1, 0, n);
  for (i = 1; i <= n; i++) {
    scanf("%d%d", &l, &r);
    if (r < 0) continue;
    l = max(l, 0);
    s.insert((eve){l, 1, l});
    s.insert((eve){r + 1, -1, l});
  }
  cha(r = 0, -0x3f3f3f3f);
  while (!s.empty()) {
    p = *s.begin();
    nu += p.v;
    l = p.x;
    s.erase(s.begin());
    if (p.l >= 0) change(1, 0, n, lower_bound(f, f + n + 1, p.l) - f, n, -p.v);
    if ((!s.empty()) && ((s.begin()->x) == l)) continue;
    x = upper_bound(f, f + n + 1, l - v0) - f - 1;
    o = nu + Ask(1, 0, n, 0, x);
    while ((r < n) && (r < o)) cha(++r, l);
  }
  printf("%d", r);
  return 0;
}
