#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:336777216")
#pragma GCC optimize("Ofast")

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

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
#define int long long int
typedef complex<long double> cd;
const long double pi=acos(-1);
typedef double db;
typedef long double ldb;
typedef pair <int, int> pii;
typedef pair <db, db> pdd;
typedef vector<int> vi;
typedef vector<vector<int> > matrix;

#define m1 make_pair
#define pb push_back
#define flush fflush(stdout)
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);
#define reset(x,v) memset(x,v,sizeof(x))
//#define sz(x) (int)(x.size())
#define fi first
#define se second
#define endl "\n"
#define debug(x) (cerr << #x << ": " << x << "\n")
#define setbits(x) __builtin_popcount(x)
#define setbitsll(x) __builtin_popcountll(x)
#define all(x) x.begin(),x.end()
#define pii pair<int,int>

inline ll gcd(ll a,ll b){if(a==0) return b;return gcd(b%a,a);}
inline ll power(ll a,ll n,ll m){if(n==0)return 1;ll p=power(a,n/2,m);p=(p%m*p%m)%m;if(n%2) return (p%m*a%m)%m;else return p;}
const ll MOD =998244353;
const ll hell=1000000007;
const int INF = 1e17;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
typedef tree<int, null_type, less<int>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
const int N=200005;
int st[4*N];int lazy[4*N];//int a[N+1];
void update(int i,int l,int r,int qs,int qe,int v)
{
    if(lazy[i]!=0)
    {
        st[i]+=(r-l+1)*lazy[i];
        if(l!=r)
        {
            lazy[2*i+1]+=lazy[i];
            lazy[2*i+2]+=lazy[i];
        }
        lazy[i]=0;
    }
    if(qs>r||qe<l)
        return;
    if(qs<=l&&qe>=r)
    {
        st[i]+=(r-l+1)*v;
        if(l!=r)
        {
            lazy[2*i+1]+=v;
            lazy[2*i+2]+=v;
        }
        lazy[i]=0;
        return;
    }
    int m=(l+r)/2;
    update(2*i+1,l,m,qs,qe,v);
    update(2*i+2,m+1,r,qs,qe,v);
    st[i]=st[2*i+1]+st[2*i+2];
}
int getsum(int i,int l,int r,int qs,int qe)
{
    if(lazy[i]!=0)
    {
        st[i]+=(r-l+1)*lazy[i];
        if(l!=r)
        {
            lazy[2*i+1]+=lazy[i];
            lazy[2*i+2]+=lazy[i];
        }
        lazy[i]=0;
    }
    if(qs>r||qe<l)
        return 0;
    if(qs<=l&&qe>=r)
        return st[i];
    int m=(l+r)/2;
    return getsum(2*i+1,l,m,qs,qe)+getsum(2*i+2,m+1,r,qs,qe);
}
void solve()
{
    int n,d,a;
    cin>>n>>d>>a;
    int h[n],x[n];
    vector<pair<int,int>> p(n);
    for(int i=0;i<n;i++)
    {
        cin>>x[i]>>h[i];
        h[i]=ceil((double)h[i]/a);
        p[i]=m1(x[i],h[i]);
    }
    sort(p.begin(),p.end());
    vector<int>x1(n);
    for(int i=0;i<n;i++)
        x1[i]=p[i].first;
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int x=getsum(0,0,n-1,i,i);
        if((p[i].second-x)>0)
        {
            ans+=(p[i].second-x);
            int in=upper_bound(x1.begin(),x1.end(),p[i].first+2*d)-x1.begin();
            in--;
            in=min(in,n-1);
            update(0,0,n-1,i,in,p[i].second-x);
        }
    }
    cout<<ans<<endl;
}
int32_t main()
{
   
    IOS;
    int t;
    t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}




Measured memory_bytes: 20352