#define _USE_MATH_DEFINES
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<utility>
#include<algorithm>
#include<climits>
#include<set>
#include<map>
#include<cmath>
#include<iomanip>
#include<iterator>
#include<queue>
#include<stack>
#include<cctype>
#include<deque>
#include<time.h>
#include<bitset>
#include<random>
#include<unordered_set>
#include<unordered_map>
#include<sstream>
#include<random>

//by Skeef79

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:16777216")
#define pb push_back
#define en '\n'
#define for0(i,n) for(int i = 0;i<n;i++)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define vec vector
#define pii pair<int,int>
#define pll pair<ll,ll>

using namespace std;

const int INF = 2000000000;
const ll LINF = 2000000000000000000;

template<typename T> void print(vector<T>& a)
{
	for (int i = 0; i < a.size(); i++)
		cout << a[i] << ' ';
	cout << en;
}

template<typename T> void print(deque<T>& a)
{
	for (int i = 0; i < a.size(); i++)
		cout << a[i] << ' ';
	cout << en;
}

template<typename T> void print(vector<vector<T>>& a)
{
	for (int i = 0; i < a.size(); i++)
	{
		for (int j = 0; j < a[i].size(); j++)
			cout << a[i][j] << ' ';
		cout << en;
	}
}

template <typename T> void input(vector<T>& a)
{
	for (int i = 0; i < a.size(); i++)
		cin >> a[i];
}

template<typename T> void input(deque<T>& a)
{
	for (int i = 0; i < a.size(); i++)
		cin >> a[i];
}

template<typename T> void input(vector<vector<T>>& a)
{
	for (int i = 0; i < a.size(); i++)
		for (int j = 0; j < a[i].size(); j++)
			cin >> a[i][j];
}



struct monster
{
	ll x, h;
};

const int N = 2 * 100000 + 1010;
ll t[4 * N];
ll tadd[4 * N];

void build(int v, int vl, int vr, vector<monster>&a)
{
	tadd[v] = 0;
	if (vl == vr)
	{
		t[v] = a[vl].h;
		return;
	}
	int vm = (vl + vr) / 2;
	build(2 * v + 1, vl, vm,a);
	build(2 * v + 2, vm + 1, vr,a);
	t[v] = t[2 * v + 1] + t[2 * v + 2];
}

void push(int v, int vl, int vr)
{
	if (tadd[v] != 0)
	{
		t[v] += (tadd[v] * ll(vr - vl + 1));
		if (vl != vr)
		{
			tadd[2 * v + 1] += tadd[v];
			tadd[2 * v + 2] += tadd[v];
		}
		tadd[v] = 0;
	}
}

ll query(int v, int vl, int vr, int l, int r)
{
	push(v, vl, vr);
	if (r < vl || vr < l)
		return 0;
	
	if (vl >= l && vr <= r)
		return t[v];

	int vm = (vl + vr) / 2;
	ll ql = query(2 * v + 1, vl, vm, l, r);
	ll qr = query(2 * v + 2, vm + 1, vr, l, r);
	return ql + qr;
}

void modify(int v, int vl, int vr, int l, int r, ll val)
{
	push(v, vl, vr);
	if (r < vl || vr < l)
		return;
	if (vl >= l && vr <= r)
	{
		tadd[v] = val;
		push(v, vl, vr);
		return;
	}
	int vm = (vl + vr) / 2;
	modify(2 * v + 1, vl, vm, l, r, val);
	modify(2 * v + 2, vm + 1, vr, l, r, val);
	t[v] = t[2 * v + 1] + t[2 * v + 2];
}


bool cmp(monster a, monster b)
{
	return a.x < b.x;
}

void solve()
{
	int n;
	ll D, A;
	
	cin >>n>> D >> A;
	vector<monster> a(n);
	for (int i = 0; i < n; i++)
		cin >> a[i].x >> a[i].h;
	
	sort(all(a), cmp);

	build(0, 0, n - 1, a);

	int curx = 0;
	ll ans = 0;
	int newx = curx;

	while (curx<n)
	{
		if (query(0, 0, n - 1, curx, curx) <= 0)
		{
			curx++;
			continue;
		}
		while (newx < n && a[newx].x - a[curx].x <= 2 * D)
			newx++;
		newx--;
		ll need = (query(0,0,n-1,curx,curx) + A - 1) / A;
		ans += need;
		modify(0, 0, n - 1, curx, newx, -need*A);
		curx++;
	}
	cout << ans;

}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
#endif

	int tst = 1;
	//cin >> tst;
	while (tst--)
		solve();

}

Measured memory_bytes: 15616