#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define rep(i,a,n) for (lli i=a;i<n;i++)
#define per(i,a,n) for (lli i=n-1;i>=a;i--)
#define mp make_pair
#define fi first
#define se second
#define SZ(x) ((lli)(x).size())
#define lli long long int
#define pii pair<lli,lli>
#define vii vector<pii>
#define pb push_back
#define eb emplace_back
#define em emplace
#define all(v)  v.begin(),v.end()
#define mod 1000000007
#define vi vector<lli>
#define vl vector<lli>
#define vll vector<pair<lli,lli>>
#define pll pair<lli,lli>
#define vvi vector<vector<lli>>
#define vvl vector<vector<lli>>
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
#define tk(args...) take(args);
#define posLSB(X) __builtin_ctz(X)
#define num1bit(X) __builtin_popcount(X)
#define numlead0(X) __builtin_clz(X)
#define umreserve(X) X.reserve(32768); X.max_load_factor(0.25);
void err(istream_iterator<string> it) {} template<typename T, typename... Args> void err(istream_iterator<string> it, T a, Args... args) { cout << *it << " = " << a << "\n"; err(++it, args...);}
void take() {} template<typename T, typename... Args> void take( T & a, Args & ... args ) { cin>>a; take(args...); }
template<class T>
void prllivec(vector<T> &a){
	for(T &x:a){
		cout<<x<<" ";
	}
	cout<<endl;
}
template<class T>
void prlliarr(T a[],lli n){
	for(lli i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
struct HASH{
  size_t operator()(const pair<lli,lli>&x)const{
    return (size_t) x.first * 37U + (size_t) x.second;
  }
};

#define endl "\n"

lli add(lli a, lli b) {
	a += b;
	if (a >= mod) a -= mod;
	return a;
}

lli mul(lli a, lli b) {
	return a * 1ll * b % mod;
}

inline bool setmin(lli &x, lli y) { return (y < x) ? x = y, 1 : 0; }
inline bool setmax(lli &x, lli y) { return (y > x) ? x = y, 1 : 0; }

lli power_mod(lli a,lli x){if(x==0) return 1;lli y=power_mod(a,x/2);lli ans=(y*y)%mod; if(x%2) ans=(ans*a)%mod;return ans;}
lli inv(lli a){return power_mod(a,mod-2);}
lli power(lli a, lli x){ if(x==0) return 1; lli y= power(a,x/2); lli ans=(y*y); if(x%2) ans*=a; return ans;}

//ONLY lliERNALLY 1 INDEXED..for all purposes of abstraction it is 0 indexed.
struct FenwickTree {
	vector<lli> bit;  // binary indexed tree
	lli n;

	FenwickTree(lli n) {
		this->n = n + 1;
		bit.assign(n + 1, 0);
	}

	FenwickTree(vector<lli> a)
	{

		this->n=SZ(a)+1;
		bit.assign(n+1,0);
		for (size_t i = 0; i < a.size(); i++)
			add(i, a[i]);
	}

	lli sum(lli idx) {
		lli ret = 0;
		for (++idx; idx > 0; idx -= idx & -idx)
			ret += bit[idx];
		return ret;
	}

	lli sum(lli l, lli r) {
		return sum(r) - sum(l - 1);
	}

	void add(lli idx, lli delta) {
		for (++idx; idx < n; idx += idx & -idx)
			bit[idx] += delta;
	}
	void range_add(lli l, lli r, lli val) {
		add(l, val);
		add(r + 1, -val);
	}

	lli polli_query(lli idx) {
		lli ret = 0;
		for (++idx; idx > 0; idx -= idx & -idx)
			ret += bit[idx];
		return ret;
	}
};
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	lli n,d,a;
	cin>>n>>d>>a;
	vector<pair<lli,lli>> xh(n);
	for(lli i=0;i<n;i++)cin>>xh[i].first>>xh[i].second;
	sort(all(xh));
	for(lli i=0;i<n;i++){
		xh[i].second+=a-1;
		xh[i].second/=a;
	}
	lli i=n-1;
	lli j=i;
	lli exp=n;
	for(lli jj=i-1;jj>=0;jj--){
		if(xh[jj].first>=xh[i].first-2*d){
			j=jj;
		}
		else{
			break;
		}
	}
	
	vector<lli> h(n);
	for(lli i=0;i<n;i++)h[i]=xh[i].second;
	lli temp=0;
	lli ans=0;
	vector<int> A(n+1);
	for(lli i=0;i<n;i++){
		temp-=A[i];
		if(xh[i].second-temp<=0)continue;
		lli start=i;
		lli end=n-1;
		lli rind=start;
		
		while(start<=end){
		
			lli mid=start+(end-start)/2;
			if(xh[mid].first<=xh[i].first+2*d){
				rind=mid;
				start=mid+1;
			}
			else{
				end=mid-1;
			}
		}
		lli need=xh[i].second-temp;
		ans+=need;
		temp+=need;
		A[rind+1]+=need;
		
	}
	cout<<ans<<endl;
}

Measured memory_bytes: 5760