#include <bits/stdc++.h>
using namespace std;
long long a, s, d, f, g, h, j, k, l, i, n, m, inf = 110000000000;
pair<long long, long long> p[100002];
struct tre {
  tre *L;
  tre *R;
  int val;
  tre() {
    L = NULL;
    R = NULL;
    val = -1;
  }
};
void add(tre *&it, long long l, long long r, long long idx, int val) {
  if (l > idx || r <= idx) return;
  if (!it) it = new tre();
  it->val = max(it->val, val);
  if (l + 1 == r) {
    return;
  }
  add(it->L, l, (l + r) / 2, idx, val);
  add(it->R, (l + r) / 2, r, idx, val);
}
int mx(tre *&it, long long l, long long r, long long lf, long long rg) {
  if (l >= rg || r <= lf) return -1;
  if (!it) return -1;
  if (l >= lf && r <= rg) return it->val;
  int r1 = mx(it->L, l, (l + r) / 2, lf, rg);
  int r2 = mx(it->R, (l + r) / 2, r, lf, rg);
  return max(r1, r2);
}
int main() {
  cin >> n;
  tre *root1 = NULL, *root2 = NULL;
  for (i = 0; i < n; i++) {
    scanf("%I64d%I64d", &a, &s);
    p[i] = {a, s};
  }
  cin >> m;
  for (i = 0; i < n; i++) {
    p[i].second *= m;
    p[i] = {p[i].first + p[i].second, -p[i].first + p[i].second};
  }
  sort(p, p + n);
  add(root1, -inf, inf, 0, 0);
  for (i = 0; i < n; i++) {
    p[i].second *= -1;
    if (p[i].first < 0) continue;
    k = mx(root1, -inf, inf, p[i].second, inf);
    if (k == -1) continue;
    add(root1, -inf, inf, p[i].second, k + 1);
    l = max(l, k + 1);
  }
  cout << l << " ";
  l = 0;
  for (i = 0; i < n; i++) {
    k = mx(root2, -inf, inf, p[i].second, inf);
    if (k == -1) k = 0;
    add(root2, -inf, inf, p[i].second, k + 1);
    l = max(l, k + 1);
  }
  cout << l;
}
