import java.util.*

fun main(args: Array<String>) = yorukatsu19e()

fun yorukatsu19e() {
    val (n, width, damage) = readLine()!!.split(' ').map { it.toLong() }
    data class Monster(val position: Long, val health: Long)

    val monsters = (1..n).map {
        readLine()!!.split(' ').map { it.toLong() }.let { Monster(it[0], it[1]) }
    }.sortedBy { it.position }

    data class Bomb(val end: Long, val amount: Long)

    val bombs = ArrayDeque<Bomb>()
    var currDamageSum = 0L
    var answer = 0L

    for ((position, health) in monsters) {
        while (bombs.isNotEmpty() && bombs.peek().end < position) {
            val bomb = bombs.poll()
            currDamageSum -= damage * bomb.amount
        }
        val need = Math.max(Math.ceil((health - currDamageSum).toDouble() / damage).toLong(), 0)
        if (need == 0L) continue
        currDamageSum += need * damage
        bombs.add(Bomb(position + width * 2, need))
        answer += need
    }

    println(answer)
}
