#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#pragma comment(linker, "/stack:200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef string str;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector <pii> vpii;
typedef vector <pll> vpll;
typedef map <str,int> mapsi;
typedef map <str,int> :: iterator mapsitr;
typedef map <int , int> mint;
typedef map <ll , ll> mll;
typedef set <int> si;
typedef set <ll> sll;
typedef si :: iterator sitr;
typedef si :: reverse_iterator rsitr;
typedef sll :: iterator sltr;
typedef sll :: reverse_iterator rsltr;
#define mset multiset

typedef mset <int> msi;
typedef mset <ll> msll;
typedef msi :: iterator msitr;
typedef msi :: reverse_iterator msritr;
typedef msll :: iterator msltr;
typedef msll :: reverse_iterator mslritr;

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define mp make_pair
#define pb push_back
#define pob pop_back
#define pf push_front
#define pof pop_front
#define fi first
#define se second
#define fs first.second
#define ss second.second
#define ff first.first
#define sf second.first
#define newl '\n'
#define fbo find_by_order
#define ook order_of_key

char to_upper (char x){
    if( 97 <= int(x) && int(x) <= 122)return char(x-32);
    else if( 65 <= int(x) && int(x) <= 90)return x;
}
char to_lower (char x){
    if( 97 <= int(x) && int(x) <= 122)return x;
    else if( 65 <= int(x) && int(x) <= 90)return char(x+32);
}
int numerize (char x){
    if(48 <= int(x) && int(x) <= 57)return int(x-'0');
    else if( 97 <= int(x) && int(x) <= 122)return int(x-96);
    else if( 65 <= int(x) && int(x) <= 90)return int(x-64);
}
bool isect (int l1, int r1, int l2, int r2){
    pii p1,p2;
    p1 = mp(l1,r1); p2 = mp(l2,r2);
    if(p1>p2)swap(p1,p2);
    if(p2.fi <= p1.se)return true;
    else return false;
}
ll quickpow (ll num1, ll num2, ll MOD){
    if(num2==0)return 1;
    else if(num2==1)return num1;
    else{
        ll temp = quickpow (num1,num2/2,MOD); ll res = ((temp%MOD) * (temp%MOD))%MOD;
        if(num2%2==1) res = ((res%MOD)*(num1%MOD))%MOD; return res;
    }
}
ll invmod (ll num, ll MOD){return quickpow (num,MOD-2,MOD);}
ll gcd (ll num1, ll num2){
    if(num1 < num2) swap(num1,num2); ll num3 = num1 % num2 ;
    while(num3 > 0){ num1 = num2; num2 = num3; num3 = num1 % num2;}
    return num2;
}
ll lcm (ll num1 , ll num2){return (ll) (num1/__gcd(num1,num2))*num2;}
// end of Template
ll n,d,A,BIT[200010];
pll mons[200010];
ll ans;

ll bins(ll x){
    ll l = 1;
    ll r = n;
    ll res;
    while(l<=r){
        ll mid = (l+r)/2;
        if(mons[mid].fi <= x){
            res = mid;
            l = mid+1;
        }
        else r = mid-1;
    }
    return res;
}
ll a[200010], q, tre[4 * 200010], lazy[4 * 200010], lf, rg, v, type;
void init(int now, int l, int r, ll val) {
	tre[now] += (r - l + 1) * val;
    if(l != r){
        lazy[now * 2] += val;
        lazy[now * 2 + 1] += val;
    }
}

void dropdown(int now, int l, int r) {
	if(lazy[now] != 0) {
		tre[now] += (r - l + 1) * lazy[now];
        if(l!=r) {
            lazy[now * 2] += lazy[now];
            lazy[now * 2 + 1] += lazy[now];
        }
        lazy[now] = 0;
	}
}

void build(int now, int l, int r) {
	if(l == r) {
		tre[now] = a[l];
		return;
	}
	int m = (l + r) / 2;
	build(now * 2, l, m);
	build(now * 2 + 1, m + 1, r);
	tre[now] = tre[now * 2] + tre[now * 2 + 1];
}

void update(int now, int l, int r, int st, int en, ll val) {
	dropdown(now, l, r);
	if(en < l || r < st) {
		return;
	}
	if(st <= l && r <= en){
        init(now, l, r ,val);
        return;
    }
    int m = (l + r) / 2;
    update(now * 2, l, m, st, en, val);
    update(now * 2 + 1, m + 1, r, st, en, val);
    tre[now] = tre[now * 2] + tre[now * 2 + 1];
}

int query(int now, int l, int r, int st, int en) {
	if(en < l || r < st) {
		return 0;
	}
	dropdown(now, l, r);
	if(st <= l && r <= en) {
		return tre[now];
	}
	int m = (l + r) / 2;
	int ret = query(now * 2, l, m, st, en) + query(now * 2 + 1, m + 1, r, st, en);
    return ret;
}

int main(){

//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin>>n>>d>>A;
    for(int i=1;i<=n;i++){
        ll x,h;cin>>x>>h;
        mons[i] = mp(x,h);
    }
    sort(mons+1,mons+1+n);
//    cout<<newl;
    ll ans = 0;
//    for(int i=1;i<=n;i++) cout<<mons[i].fi<<" "<<mons[i].se<<newl;
    build(1, 1, n);
    for(int i=1;i<=n;i++){
//        cout<<i<<newl;
        ll health = (mons[i].se - query(1, 1, n, i, i) * A);
        if(health > 0){
            ll p = bins(mons[i].fi + 2*d);
            ll bomb = health / A;
            if(health % A) bomb++;
//            cout<<"p = "<<p<<newl;
//            cout<<"health = "<<health<<newl;
//            cout<<"bomb = "<<bomb<<newl;
            update(1, 1, n, i, p, bomb);
//            update(p,bomb);
//            update(i-1,-bomb);
            if(bomb>=0) ans+=bomb;
        }
//        for(int j=1;j<=n;j++) cout<<"bombed "<<j<<" = "<<getsum(j)<<newl;
    }


    cout<<ans<<newl;
}


Measured memory_bytes: 18688