#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
#define FOR(i,a,n) for(ll i=(ll)a;i<(ll)n;i++)
#define RFOR(i,a,n) for(ll i=(ll)n-1;i >= (ll)a;i--)
#define rep(i,n) FOR(i,0,n)
#define rrep(i,n) RFOR(i,0,n)
#define ALL(v) v.begin(), v.end()
#define bra(first,second) '(' << first << ',' << second << ')'
ll MOD = 1000000007;
//ll INF = 21474836470000000;
ll INF = 1000000000000000000;
long double EPS = 1e-11;
long double PI = 3.141592653589793238;
template<typename T>
void remove(std::vector<T>& vector, unsigned int index){
    vector.erase(vector.begin() + index);
}

using Graph = vector<vector<ll>>;

ll N,D,A;
vector<pair<ll,ll>> B;
vector<ll> X,H;
 
template <class T>
class SegmentTree{
  ll N;
  vector<T> data;
  vector<T> lazy;
  T def;
  function<T(T,T)> operation;
  function<T(T,T)> update;
  public:
  SegmentTree(size_t _N,T _def,function<T(T,T)> _operaition,function<T(T,T)> _update):def(_def),operation(_operaition),update(_update){
          N = 1;
          while(N < _N){
              N *= 2;
          }
          data = vector<T>(2*N-1,def);
          lazy = vector<T>(2*N-1,0);
  }

  void change(ll i,ll x){
      i += N-1;
      data[i] = update(data[i],x);
      while(i > 0){
          i = (i-1)/2;
          data[i] = oparaition(data[i*2+1],data[i*2+2]);
      }
  }

  void eval(ll k,ll l,ll r){
      if(lazy[k] != 0){
          data[k] += lazy[k];
          if(r - l > 1){
              lazy[k*2+1] += (lazy[k] / 2);
              lazy[k*2+2] += (lazy[k] / 2);
          }
          lazy[k] = 0;
      }
  }

  void add(ll a,ll b,ll x,ll k = 0,ll l = 0,ll r = -1){
      if(r < 0) r = N;
      eval(k,l,r);
      if(b <= l || r <= a) return;
      if(a <= l && r <= b){
          lazy[k] += (r-l) * x;
          eval(k,l,r);
      }else{
          add(a,b,x,k*2+1,l,(l+r)/2);
          add(a,b,x,k*2+2,(l+r)/2,r);
          data[k] = data[k*2+1] + data[k*2+2];
      }
  }
  
  T query(ll a,ll b,ll k = 0,ll l = 0,ll r = -1){
      if(r < 0) r = N;
      eval(k,l,r);
      if(b <= l || r <= a) return def;
      if(a <= l && r <= b){
          return data[k];
      }else{
          T c1 = query(a,b,k*2+1,l,(l+r)/2);
          T c2 = query(a,b,k*2+2,(l+r)/2,r);
          return operation(c1,c2);
      }
  }

  T operator[](ll i){
      return lazy[i+N-1];
  }

  T oper(ll i){
      return data[i+N-1];
  }
};

ll lwb(ll x){
    ll l = -1,r = N;
    while(r - l > 1){
        ll mid = (r+l) / 2;
        if(X[mid] >= x) r = mid;
        else l = mid;
    }
    return r;
}

int main(){
    cin >> N >> D >> A;
    rep(i,N){
        ll x,h;
        cin >> x >> h;
        B.emplace_back(x,h);
    }
    sort(ALL(B));
    rep(i,N){
        X.push_back(B[i].first);
        H.push_back(B[i].second);
    }
    auto f = [](ll a,ll b){return a+b;};
    auto g = [](ll a,ll b){return b;};
    SegmentTree<ll> ST(N,0,f,g);
    ll ans = 0;
    rep(i,N){
        H[i] -= A * ST.query(i,i+1);
        if(H[i] <= 0){
            continue;
        }
        ll r = lwb(X[i] + 2 * D + 1);
        //cout << i << ' ' << r << endl;
        ll v = (H[i] + A - 1) / A;
        ST.add(i,r,v);
        ans += v;
    }
    //cout << lwb(5) << endl;
    cout << ans << endl;
}

Measured memory_bytes: 17260