#include <iostream>
#include <string>
#include <utility>
#include <sstream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <bitset>
#include <cmath>
#include <cstring>
#include <iomanip>
#include <fstream>
#include <cassert>

using namespace std;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define INF 1000000000
#define LL_INF 4500000000000000000
#define LSOne(S) (S & (-S))
#define EPS 1e-9
#define A first
#define B second
#define mp make_pair
#define pb push_back
#define PI acos(-1.0)
#define ll long long
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;

struct MaxQueue {
    //         value, index
    deque<pair<int,   int  >> dq;
    int L = 0, R = -1;

    void insert(int x) {
        while (!dq.empty() && dq.back().A <= x) {
            dq.pop_back();
        }
        dq.emplace_back(x, ++R);
    }

    int size() { return R - L + 1; }

    void del() {
        if (dq.front().B == L++) dq.pop_front();
    }

    int query() { return dq.front().A; }
};

int main() {
    freopen("crowded.in", "r", stdin);
    freopen("crowded.out", "w", stdout);

    int n, d; cin >> n >> d;
    vector<pair<int, ii>> leftCows;
    vector<pair<int, ii>> rightCows;
    F0R(i, n) {
        int a, b; cin >> a >> b;
        leftCows.push_back(mp(a, mp(b, i)));
        leftCows.push_back(mp(a+d, mp(-1, -1)));
        rightCows.push_back(mp(a-d, mp(-1, -1)));
        rightCows.push_back(mp(a, mp(b, i)));
    }
    sort(leftCows.begin(), leftCows.end());
    sort(rightCows.begin(), rightCows.end());
    reverse(rightCows.begin(), rightCows.end());

    bool leftCrowded[n]; memset(leftCrowded, false, sizeof leftCrowded);
    MaxQueue left;
    for (pair<int, ii> cow : leftCows) {
        if (cow.B.A == -1) left.del();
        else {
            if (left.size() > 0 && left.query() >= 2*cow.B.A) {
                leftCrowded[cow.B.B] = true;
            }
            left.insert(cow.B.A);
        }
    }

    int ans = 0;
    MaxQueue right;
    for (pair<int, ii> cow : rightCows) {
        if (cow.B.A == -1) right.del();
        else {
            if (right.size() > 0 && right.query() >= 2*cow.B.A && leftCrowded[cow.B.B]) {
                ans++;
            }
            right.insert(cow.B.A);
        }
    }

    cout << ans << endl;

    return 0;
}