// Arup Guha
// 6/20/2023
// Solution to Kattis Problem: Watering Grass
// https://open.kattis.com/problems/grass

using namespace std;
#include <bits/stdc++.h>

int solve(vector<pair<double,double>>& ranges, int len);

int main() {

    int n;

    // Process cases.
    while (cin >> n) {

        int len, w;
        cin >> len >> w;

        vector<pair<double,double>> ranges;
        for (int i=0; i<n; i++) {
            double x, r;
            cin >> x >> r;

            // Not a useful sprinkler.
            if (2*r <= w) continue;

            // Pythagorean formula...
            double halfRange = sqrt(r*r-w*w/4.0);

            // This is the range of x values covered by this sprinkler.
            ranges.emplace_back(x-halfRange,x+halfRange);
        }

        // Sort in order.
        sort(ranges.begin(), ranges.end());

        // Ta da!
        cout << solve(ranges, len) << endl;
    }

    return 0;
}

int solve(vector<pair<double,double>>& ranges, int len) {

    double covered = 0;
    int i = 0, res = 0;

    while (i < ranges.size()) {

        // Get this out of the way!
        if (covered >= len) return res;

        // Find the range of circles we could add next.
        int j = i;
        while (j<ranges.size() && ranges[j].first <= covered) j++;

        // Can't do it for sure.
        if (j == i) return -1;

        // Find the farthest any circle in this range can cover.
        double maxReach = ranges[i].second;
        for (int z=i; z<j; z++)
            maxReach = max(maxReach, ranges[z].second);

        // Add circle, update where we're covered until.
        res++;
        covered = maxReach;
        i = j;
    }

    // Just check before returning.
    return covered >= len ? res : -1;
}
