Problem: Silver Fox is fighting with N monsters.

The monsters are standing in a row, and we can assume them to be standing on a number line. The i-th monster, standing at the coordinate X_i, has the health of H_i.

Silver Fox can use bombs to attack the monsters. Using a bomb at the coordinate x decreases the healths of all monsters between the coordinates x-D and x+D (inclusive) by A. There is no way other than bombs to decrease the monster's health.

Silver Fox wins when all the monsters' healths become 0 or below.

Find the minimum number of bombs needed to win.

Constraints

* 1 \leq N \leq 2 \times 10^5
* 0 \leq D \leq 10^9
* 1 \leq A \leq 10^9
* 0 \leq X_i \leq 10^9
* 1 \leq H_i \leq 10^9
* X_i are distinct.
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N D A
X_1 H_1
:
X_N H_N


Output

Print the minimum number of bombs needed to win.

Examples

Input

3 3 2
1 2
5 4
9 2


Output

2


Input

9 4 1
1 5
2 4
3 3
4 2
5 1
6 2
7 3
8 4
9 5


Output

5


Input

3 0 1
300000000 1000000000
100000000 1000000000
200000000 1000000000


Output

3000000000

Solution (in JAVA):

Solution:
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Comparator;
import java.util.ArrayList;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 *
 * @author silviase
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        Scanner in = new Scanner(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        FSilverFoxVsMonster solver = new FSilverFoxVsMonster();
        solver.solve(1, in, out);
        out.close();
    }

    static class FSilverFoxVsMonster {
        public void solve(int testNumber, Scanner in, PrintWriter out) {

            int n = in.nextInt();
            long range = in.nextInt();
            long atk = in.nextInt();
            long[] point = new long[n];
            long[] health = new long[n];
            ArrayList<Pair> ph = new ArrayList<>();
            long ans = 0;
            for (int i = 0; i < n; i++) {
                ph.add(new Pair(in.nextInt(), in.nextInt()));
            }
            ph.sort(Comparator.comparing(i -> i.x));

            // out.println(ph.toString());


            long[] accAtk = new long[n + 1];
            Arrays.fill(accAtk, 0);
            // 残っているものについて、左から順に右に2Dの範囲で攻撃する.
            int nowToAtk = 0;
            while (nowToAtk != n) {
                accAtk[nowToAtk] = nowToAtk == 0 ? 0 : accAtk[nowToAtk - 1] + accAtk[nowToAtk];
                if (accAtk[nowToAtk] >= ph.get(nowToAtk).y) {
                    // すでに倒れている
                    nowToAtk++;
                    continue;
                }
                long key = ph.get(nowToAtk).x + 2 * range;
                long time = (ph.get(nowToAtk).y - accAtk[nowToAtk] - 1 + atk) / atk;
                int ng = -1;
                int ok = point.length;
                while (Math.abs(ok - ng) > 1) {
                    int mid = (ok + ng) / 2;
                    if (ph.get(mid).x > key) {
                        ok = mid;
                    } else {
                        ng = mid;
                    }
                }
                // out.println("ok:" + ok);
                accAtk[nowToAtk] += atk * time;
                accAtk[ok] -= atk * time;
                ans += time;
                nowToAtk++;
                // System.out.println(Arrays.toString(accAtk));

            }
            out.println(ans);

        }

    }

    static class Pair {
        public long x;
        public long y;

        public Pair(long x, long y) {
            this.x = x;
            this.y = y;
        }

        public String toString() {
            return "Pair{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }

    }
}