#include <bits/stdc++.h>
#define sz(x) (int)(x).size()
#define For(i, a, b) for (int i = int(a); i < int(b); i++)
#define Dor(i, a, b) for (int i = int(b) - 1; i >= int(a); i--)
#define Foz(i, a) For(i, 0, a)
#define Doz(i, a) Dor(i, 0, a)
#define Trav(e, v) for (auto& e : v)
#define pb push_back
#define mp make_pair
#define all(x) begin(x), end(x)
using namespace std;
using ll = long long;
using ii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vii = vector<ii>;
template <typename T> bool ckmin (T& a, T b) { return (b < a) ? a = b, 1 : 0; }
template <typename T> bool ckmax (T& a, T b) { return (b > a) ? a = b, 1 : 0; }
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#ifdef XVENOM
	#define errp(...) fprintf(stderr, __VA_ARGS__)
	#define dbg(...) errp("[%s]: ", #__VA_ARGS__), dbg_str(__VA_ARGS__)
#else
	#define errp(...)
	#define dbg(...)
#endif
template <typename U, typename V> string to_string (pair<U, V>);
string to_string (string& e) { return "\"" + e + "\""; }
string to_string (char e) { return "\'" + string(1, e) + "\'"; }
string to_string (bool e) { return e ? "true" : "false"; }
template <typename T> string to_string (T e) {
	string s = "[ ";
	for (auto& x : e) s += to_string(x) + " ";
	return s + "]";
}
template <typename U, typename V> string to_string (pair<U, V> e) {
	return "(" + to_string(e.first) + ", " + to_string(e.second) + ")";
}
void dbg_str () { errp(" \n"); }
template <typename U, typename... V> void dbg_str (U u, V... v) {
 	errp(" %s", to_string(u).c_str()); dbg_str(v...);
}
/* --- */
template <int SZ>
class LazySeg {
private:
	ll seg[SZ * 4], upd[SZ * 4];
	int n, p, q, updVal;
	inline int lf (int i) { return (i << 1); }
	inline int rt (int i) { return (i << 1)|1; }
	void upd_value (int l, int r, int k) {
		seg[k] += (r - l + 1) * upd[k];
	}

	void pull_value (int l, int r, int k) {
		seg[k] = seg[lf(k)] + seg[rt(k)];	
	}

	void push_update (int l, int r, int k) {
		int t = upd[k]; upd[k] = 0;
		if (l == r) return;
		upd[lf(k)] += t;
		upd[rt(k)] += t;
	}

	void updateSeg (int l, int r, int k) {
		if (p <= l && r <= q) {
			upd[k] += updVal;
			upd_value(l, r, k); push_update(l, r, k); return;
		}
		if (p > r || q < l) {
			upd_value(l, r, k); push_update(l, r, k); return;
		}
		push_update(l, r, k);
		int m = (l + r) / 2;
		updateSeg(l, m, lf(k)); updateSeg(m + 1, r, rt(k));
		pull_value(l, r, k);
	}

	ll querySeg (int l, int r, int k) {
		if (p <= l && r <= q) {
			upd_value(l, r, k); push_update(l, r, k);
			return seg[k];
		}
		if (p > r || q < l) {
			upd_value(l, r, k); push_update(l, r, k);
			return 0;
		}
		push_update(l, r, k);
		int m = (l + r) / 2;
		ll res = querySeg(l, m, lf(k)) + querySeg(m + 1, r, rt(k));
		pull_value(l, r, k);
		return res;
	}

public:
	LazySeg () {
		memset(upd, 0, sizeof upd);
		memset(seg, 0, sizeof seg);
	}
	
	void init (int _n) { n = _n; }

	void update (int l, int r, int val) {
		updVal = val; p = l; q = r;
		updateSeg(0, n - 1, 1);
	}

	ll query (int l, int r) {
		p = l; q = r;
		return querySeg(0, n - 1, 1);
	}
};
/* --- */
const int N = 200010;
LazySeg<N> seg;
int n, d, a, x[N], h[N];
vii pts;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	/* --- */
	cin >> n >> d >> a;
	int p, q;
	Foz(i, n) { cin >> p >> q; pts.pb({p, q}); }
	sort(all(pts));
	Foz(i, n) { x[i] = pts[i].first; h[i] = pts[i].second; }

	seg.init(n);
	Foz(i, n) seg.update(i, i, h[i]);
	
	ll ans = 0;
	int r = -1;
	Foz(l, n) {
		int hp = seg.query(l, l);
		if (hp <= 0) continue;
		while (r + 1 < n && x[r + 1] - x[l] <= 2 * d) r++;
		ll k = (hp - 1) / a + 1;
		ans += k;
		seg.update(l, r, k * a * -1);
	}
	cout << ans << '\n';
}



Measured memory_bytes: 15984