#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;
typedef long long ll;
typedef pair<int, int> P;

const int MN = 100100;
int n, m, k;
ll p, h[MN], a[MN];
ll h2[MN];
bool check(ll x) {
    fill_n(h2, n, x);
    priority_queue<P, vector<P>, greater<P>> q;
    for (int i = 0; i < n; i++) {
        if (h2[i] - m*a[i] >= 0) continue;
        q.push(P(h2[i]/a[i]-1, i));
    }
    int count = 0;
    for (; count < m*k; count++) {
        if (q.empty()) break;
        P hit = q.top(); q.pop();
        if (hit.first < count/k) return false;
        int i = hit.second;
        h2[i] += p;
        if (h2[i] - m*a[i] >= 0) continue;
        q.push(P(h2[i]/a[i]-1, i));
    }
    if (count > m*k) return false;
    for (int i = 0; i < n; i++) {
        if (h2[i] - m*a[i] >= h[i]) continue;
        count += (h[i] - (h2[i] - m*a[i]) + p-1) / p;
        if (count > m*k) return false;
    }
    return true;
}

int main() {
    cin >> n >> m >> k >> p;
    for (int i = 0; i < n; i++) {
        cin >> h[i] >> a[i];
    }

    ll l = 0, r = 1LL<<55;
    while (r-l > 1) {
        ll md = (l+r)/2;
        if (check(md)) {
            r = md;
        } else {
            l = md;
        }
    }
    cout << r << endl;
    return 0;
}