12
-6712 6
2375 73
4643 197
-5660 215
-378 223
2228 307
3305 340
3449 468
-4389 707
-7161 729
-1838 921
-1655 985
730
 5
1 5
6 7
17127 17
17072 42
17042 77
3
 7
-976754 20479
79929143 911181
9598220 82517
-51609349 810257
67416551 266544
-14170975 307690
-15476178 491195
352
 22
-5301 602
-1400 194
-8512 987
-282 962
6484 494
9091 523
-7744 92
6002 461
5053 305
-1339 272
-821 165
9308 785
929 421
8384 883
1266 157
8411 923
-2949 885
7725 687
6859 197
-7630 867
5031 918
5662 410
41

11 12
 2 3
 5 5
 9 9

#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
const int inf = 1e9;
const int MAXN = 100020;
int t[4 * MAXN];
int getm(int v, int l, int r, int ql, int qr) {
  if (ql >= r || l >= qr) {
    return -inf;
  }
  if (l >= ql && r <= qr) {
    return t[v];
  }
  return max(getm(2 * v + 1, l, (l + r) / 2, ql, qr),
             getm(2 * v + 2, (l + r) / 2, r, ql, qr));
}
void upd(int v, int l, int r, int ql, int qr, int x) {
  if (ql >= r || l >= qr) {
    return;
  }
  if (l >= ql && r <= qr) {
    t[v] = x;
    return;
  }
  upd(2 * v + 1, l, (l + r) / 2, ql, qr, x);
  upd(2 * v + 2, (l + r) / 2, r, ql, qr, x);
  t[v] = max(t[2 * v + 1], t[2 * v + 2]);
}
signed main() {
  ios_base::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  srand(time(NULL));
  int n;
  cin >> n;
  vector<pair<long long, long long>> a(n);
  for (auto& i : a) cin >> i.first >> i.second;
  long long v;
  cin >> v;
  vector<pair<pair<long long, long long>, bool>> kek(n);
  kek.push_back({{0, 0}, 1});
  for (int i = 0; i < n; ++i) {
    kek[i].first.first = a[i].first - a[i].second * v;
    kek[i].first.second = -a[i].first - a[i].second * v;
  }
  sort((kek).begin(), (kek).end());
  vector<long long> keks;
  for (int i = 0; i <= n; ++i) keks.push_back(kek[i].first.second);
  sort((keks).begin(), (keks).end());
  keks.resize(unique((keks).begin(), (keks).end()) - keks.begin());
  for (int i = 0; i <= n; ++i) {
    kek[i].first.second =
        lower_bound((keks).begin(), (keks).end(), kek[i].first.second) -
        keks.begin();
  }
  long long ans1 = -inf, ans2 = -inf;
  for (int i = 0; i <= n; ++i) {
    long long kekos = getm(0, 0, keks.size(), 0, kek[i].first.second + 1) + 1;
    if (kek[i].second) {
      ans1 = max(ans1, kekos - 1);
    } else {
      upd(0, 0, keks.size(), kek[i].first.second, kek[i].first.second + 1,
          kekos);
      ans2 = max(ans2, kekos);
    }
  }
  cout << ans1 << ' ' << ans2;
}
