#include <bits/stdc++.h>
using namespace std;
long long int divencima(long long int a, long long int b) {
  return a / b + (a % b != 0);
}
long long int cortesnecesarios(long long int hle, long long int a,
                               long long int m, long long int H,
                               long long int p) {
  long long int x = hle + a * m - H;
  if (x <= 0) return 0;
  return divencima(x, p);
}
const int limite = 1000000;
long long int cuantos[limite];
long long int n, m, k, p;
long long int puede(long long int hle, long long int posle,
                    long long int posmed, long long int a,
                    long long int cortesaqui, long long int cortes,
                    long long int H) {
  long long int hmedmas1 =
      max(0LL, hle + (posmed - posle) * a - cortesaqui * p) + a;
  return cortesnecesarios(hmedmas1, a, m - posmed, H, p) <= cortes - cortesaqui;
}
int computaposmed(long long int hle, long long int posle, long long int a,
                  long long int cortes, long long int H) {
  int inf = posle - 1;
  int sup = m;
  while (inf + 1 < sup) {
    int med = (inf + sup) / 2;
    if (puede(hle, posle, med, a, 1, cortes, H))
      sup = med;
    else
      inf = med;
  }
  return sup;
}
void coloca(long long int h, long long int a, long long int cortes,
            long long int H) {
  long long int hle = h;
  int posle = 1;
  while (cortes) {
    int posmed = computaposmed(hle, posle, a, cortes, H);
    if (posmed == m) {
      cuantos[m] += cortes;
      return;
    }
    long long int cortesaqui = 1;
    while (cortesaqui + 1 <= cortes and
           puede(hle, posle, posmed, a, cortesaqui + 1, cortes, H))
      cortesaqui++;
    cuantos[posmed] += cortesaqui;
    hle = max(0LL, hle + (posmed - posle) * a - cortesaqui * p) + a;
    posle = posmed + 1;
    cortes -= cortesaqui;
  }
}
long long int h[limite], a[limite];
long long int cortes[limite];
long long int topecortes;
bool puede(long long int H) {
  long long int sumacortes = 0;
  for (int i = 1; i <= n; i++) {
    if (H - a[i] < 0) return false;
    cortes[i] = cortesnecesarios(h[i], a[i], m, H, p);
    sumacortes += cortes[i];
    if (sumacortes > topecortes) return false;
  }
  for (int i = 1; i <= m; i++) cuantos[i] = 0;
  for (int i = 1; i <= n; i++) coloca(h[i], a[i], cortes[i], H);
  long long int c = 0;
  for (int i = m; i >= 1; i--) {
    c += cuantos[i];
    if (c > k * (m - i + 1)) return false;
  }
  return true;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> k >> p;
  topecortes = k * m;
  for (int i = 1; i <= n; i++) cin >> h[i] >> a[i];
  long long int inf = 0;
  long long int sup = 1000000000000000LL;
  while (inf + 1 < sup) {
    long long int med = (inf + sup) / 2;
    if (puede(med))
      sup = med;
    else
      inf = med;
  }
  cout << sup << endl;
}
