← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int64 {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
			idx++
		}
		sign := int64(1)
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		var v int64
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			v = v*10 + int64(data[idx]-'0')
			idx++
		}
		return v * sign
	}

	n := int(nextInt())
	m := int(nextInt())
	k := int(nextInt())
	p := nextInt()

	aArr := make([]int64, n)
	gArr := make([]int64, n)
	fArr := make([]int64, n)

	mi := int64(m)
	var maxA int64
	var upper int64

	for i := 0; i < n; i++ {
		h := nextInt()
		a := nextInt()
		g := mi * a
		f := h + g
		aArr[i] = a
		gArr[i] = g
		fArr[i] = f
		if a > maxA {
			maxA = a
		}
		if f > upper {
			upper = f
		}
	}

	ceilPos := func(x, y int64) int64 {
		if x <= 0 {
			return 0
		}
		return (x + y - 1) / y
	}

	totalCap := int64(m * k)

	check := func(H int64) bool {
		if H < maxA {
			return false
		}
		cnt := make([]int64, m+1)
		var total int64

		for i := 0; i < n; i++ {
			t := ceilPos(fArr[i]-H, p)
			total += t
			if total > totalCap {
				return false
			}

			u := ceilPos(gArr[i]-H, p)
			a := aArr[i]

			for r := int64(0); r < u; r++ {
				d := int((H + r*p) / a)
				cnt[d]++
			}
			cnt[m] += t - u
		}

		var used int64
		kk := int64(k)
		for s := 1; s <= m; s++ {
			used += cnt[s]
			if used > int64(s)*kk {
				return false
			}
		}
		return true
	}

	l, r := maxA-1, upper
	for l+1 < r {
		mid := (l + r) >> 1
		if check(mid) {
			r = mid
		} else {
			l = mid
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprint(out, r)
	out.Flush()
}