Problem:
Score : 600 points

Problem Statement

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.

Sample Input 1

3 3 2
1 2
5 4
9 2

Sample Output 1

2

First, let us use a bomb at the coordinate 4 to decrease the first and second monsters' health by 2.

Then, use a bomb at the coordinate 6 to decrease the second and third monsters' health by 2.

Now, all the monsters' healths are 0.
We cannot make all the monsters' health drop to 0 or below with just one bomb.

Sample Input 2

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

Sample Output 2

5

We should use five bombs at the coordinate 5.

Sample Input 3

3 0 1
300000000 1000000000
100000000 1000000000
200000000 1000000000

Sample Output 3

3000000000

Watch out for overflow.

Solution in Fortran (gfortran v4.8.4) (judge verdict: Wrong Answer)

program main
    implicit none
    integer(8):: n, d, a, i, num, adble
    integer(8), allocatable:: x(:), h(:)
    integer(8), parameter:: one = 1

    read*, n, d, a
    allocate(x(n), h(n))

    do i = 1, n
        read*, x(i), h(i)
    end do

    call marge_sort(x(:), h(:), one, n)

    num = 0
    do i=1,n
        num = num + h(i)/a
        if (mod(h(i),a) /= 0) num = num + 1
        where (x < x(i)+2*d )
            h = h - num*a
        end where
        
        where (h(:) < 0)
            h = 0
        end where

        if (sum(h) == 0) exit
    end do

    print*, num



contains
recursive subroutine marge_sort(x,h, first, last)
    integer(8):: x(:), h(:), first, last
    integer(8):: tmp, mean

    if (last-first <= 1) then
        if (x(last) < x(first)) then
            tmp = x(last)
            x(last) = x(first)
            x(first) = tmp

            tmp = h(last)
            h(last) = h(first)
            h(first) = tmp            
        end if

    else
        mean = (first+last)/2
        call marge_sort(x(:), h(:), first, mean)
        call marge_sort(x(:), h(:), mean+1, last)
        call marge(x(:), h(:), first, mean, last)

    end if
end subroutine


subroutine marge(x,h,first,mean,last)
    integer(8):: x(:), h(:), first, mean, last
    integer(8), allocatable:: tmpx(:), tmph(:)
    integer(8):: r, l, i

    allocate(tmpx(last-first+1), tmph(last-first+1))
    r = first
    l = mean + 1
    i = 1

    do while(r <= mean .and. l <= last)
        if (x(r) <= x(l)) then
            tmpx(i) = x(r)
            tmph(i) = h(r)
            i = i+1
            r = r+1
        else
            tmpx(i) = x(l)
            tmph(i) = h(l)
            i = i+1
            l = l+1
        end if
    end do

    if (r > mean)then
        tmpx(i:) = x(l:last)
        tmph(i:) = h(l:last)
    else
        tmpx(i:) = x(r:mean)
        tmph(i:) = h(r:mean)
    end if

    x(first:last) = tmpx(:)
    h(first:last) = tmph(:)
    
end subroutine
end program main