#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  register long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
const long long N = 1e5 + 10;
long long n, m, k, p;
long long h[N], a[N];
long long c[N];
struct node {
  long long t, id;
  bool operator<(const node& x) const { return t > x.t; }
};
priority_queue<node> q;
bool check(long long x) {
  while (!q.empty()) q.pop();
  memset(c, 0, sizeof c);
  for (long long i = 1; i <= n; i++)
    if (x - a[i] * m < h[i]) q.push((node){x / a[i], i});
  for (long long i = 1; !q.empty() && i <= m; i++)
    for (long long j = 1; !q.empty() && j <= k; j++) {
      node u = q.top();
      q.pop();
      if (u.t < i) return 0;
      ++c[u.id];
      if (x + c[u.id] * p - a[u.id] * m < h[u.id])
        q.push((node){(x + c[u.id] * p) / a[u.id], u.id});
    }
  return q.empty();
}
signed main() {
  n = read(), m = read(), k = read(), p = read();
  for (long long i = 1; i <= n; i++) h[i] = read(), a[i] = read();
  long long l = 0, r = 1e15, ans;
  while (l <= r) {
    long long mid = l + r >> 1;
    if (check(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  cout << ans;
}
