import sys

sys.setrecursionlimit(10 ** 7)



sr = lambda: sys.stdin.readline().rstrip()

ir = lambda: int(sr())

lr = lambda: list(map(int, sr().split()))



N, D, A = lr()

XH = [lr() for _ in range(N)]

XH.sort()



over = [N] * N # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし）

cur = 1

for i in range(N):

    while cur < N and XH[i][0] + D + D >= XH[cur][0]:

        cur += 1

    over[i] = cur



damage = 0 # 今までの累計のダメージ数　(影響のないダメージは引く)

reset = [0] * (N+1) # これ以降関係のないダメージ

answer = 0

for i in range(N):

    x, h = XH[i]

    damage -= reset[i]

    h -= damage

    if h > 0:

        time = (h+A-1)//A

        answer += time

        damage += A * time

        reset[over[i]] += A * time



print(answer)

import sys

sys.setrecursionlimit(10 ** 7)



sr = lambda: sys.stdin.readline().rstrip()

ir = lambda: int(sr())

lr = lambda: list(map(int, sr().split()))



def main():

    N, D, A = lr()

    XH = [lr() for _ in range(N)]

    XH.sort()



    over = [N] * N # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし）

    cur = 1

    for i in range(N):

        while cur < N and XH[i][0] + D + D >= XH[cur][0]:

            cur += 1

        over[i] = cur



    damage = 0 # 今までの累計のダメージ数　(影響のないダメージは引く)

    reset = [0] * (N+1) # これ以降関係のないダメージ

    answer = 0

    for i in range(N):

        x, h = XH[i]

        damage -= reset[i]

        h -= damage

        if h > 0:

            time = (h+A-1)//A

            answer += time

            damage += A * time

            reset[over[i]] += A * time



    print(answer)



if __name__ == "__main__":

    main()
import sys

sys.setrecursionlimit(10**7)
sr = lambda: sys.stdin.readline().rstrip()
ir = lambda: int(sr())
lr = lambda: list(map(int, sr().split()))
N, D, A = lr()
XH = [lr() for _ in range(N)]
XH.sort()
over = [N] * N  # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし）
cur = 1
for i in range(N):
    while cur < N and XH[i][0] + D + D >= XH[cur][0]:
        cur += 1
    over[i] = cur
damage = 0  # 今までの累計のダメージ数　(影響のないダメージは引く)
reset = [0] * (N + 1)  # これ以降関係のないダメージ
answer = 0
for i in range(N):
    x, h = XH[i]
    damage -= reset[i]
    h -= damage
    if h > 0:
        time = (h + A - 1) // A
        answer += time
        damage += A * time
        reset[over[i]] += A * time
print(answer)

import sys

sys.setrecursionlimit(10**7)
sr = lambda: sys.stdin.readline().rstrip()
ir = lambda: int(sr())
lr = lambda: list(map(int, sr().split()))


def main():
    N, D, A = lr()
    XH = [lr() for _ in range(N)]
    XH.sort()
    over = [N] * N  # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし）
    cur = 1
    for i in range(N):
        while cur < N and XH[i][0] + D + D >= XH[cur][0]:
            cur += 1
        over[i] = cur
    damage = 0  # 今までの累計のダメージ数　(影響のないダメージは引く)
    reset = [0] * (N + 1)  # これ以降関係のないダメージ
    answer = 0
    for i in range(N):
        x, h = XH[i]
        damage -= reset[i]
        h -= damage
        if h > 0:
            time = (h + A - 1) // A
            answer += time
            damage += A * time
            reset[over[i]] += A * time
    print(answer)


if __name__ == "__main__":
    main()

-N, D, A = lr() -XH = [lr() for _ in range(N)] -XH.sort() -over = [N] * N  # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし） -cur = 1 -for i in range(N): -    while cur < N and XH[i][0] + D + D >= XH[cur][0]: -        cur += 1 -    over[i] = cur -damage = 0  # 今までの累計のダメージ数　(影響のないダメージは引く) -reset = [0] * (N + 1)  # これ以降関係のないダメージ -answer = 0 -for i in range(N): -    x, h = XH[i] -    damage -= reset[i] -    h -= damage -    if h > 0: -        time = (h + A - 1) // A -        answer += time -        damage += A * time -        reset[over[i]] += A * time -print(answer) + + +def main(): +    N, D, A = lr() +    XH = [lr() for _ in range(N)] +    XH.sort() +    over = [N] * N  # over[i]はi番目のモンスターを攻撃した時影響のないモンスターの最小値（最大はNで対象なし） +    cur = 1 +    for i in range(N): +        while cur < N and XH[i][0] + D + D >= XH[cur][0]: +            cur += 1 +        over[i] = cur +    damage = 0  # 今までの累計のダメージ数　(影響のないダメージは引く) +    reset = [0] * (N + 1)  # これ以降関係のないダメージ +    answer = 0 +    for i in range(N): +        x, h = XH[i] +        damage -= reset[i] +        h -= damage +        if h > 0: +            time = (h + A - 1) // A +            answer += time +            damage += A * time +            reset[over[i]] += A * time +    print(answer) + + +if __name__ == "__main__": +    main()