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>
void Get(int &T) {
  char C;
  bool F = 0;
  for (; C = getchar(), C < '0' || C > '9';)
    if (C == '-') F = 1;
  for (T = C - '0'; C = getchar(), C >= '0' && C <= '9'; T = T * 10 + C - '0')
    ;
  F && (T = -T);
}
void Get(long long &T) {
  char C;
  bool F = 0;
  for (; C = getchar(), C < '0' || C > '9';)
    if (C == '-') F = 1;
  for (T = C - '0'; C = getchar(), C >= '0' && C <= '9'; T = T * 10 + C - '0')
    ;
  F && (T = -T);
}
int N;
long long X[100005];
long long T[100005];
int Order[100005];
long long V;
int F[100005];
bool Cmp(int A, int B) {
  if (T[A] != T[B]) return T[A] < T[B];
  return X[A] < X[B];
}
void Init() {
  Get(N);
  for (int i = 1; i <= N; i++) {
    Get(X[i]);
    Get(T[i]);
    Order[i] = i;
  }
  Get(V);
  for (int i = 0; i <= N; i++) {
    long long NewX = X[i] + T[i] * V;
    long long NewY = -X[i] + T[i] * V;
    X[i] = NewX;
    T[i] = NewY;
  }
  std::sort(Order + 1, Order + N + 1, Cmp);
}
long long Stack[100005];
int StackTop;
int BinSrh(int L, int R, long long X) {
  for (;;) {
    if (L == R) return L;
    if (L + 1 == R) {
      if (X < Stack[L]) return L;
      return R;
    }
    int Mid = L + R;
    Mid >>= 1;
    if (X < Stack[Mid])
      R = Mid;
    else
      L = Mid;
  }
}
int Ans1, Ans2;
void Work() {
  F[0] = 0;
  memset(Stack, 0x2f, sizeof Stack);
  Stack[0] = X[0];
  StackTop = 0;
  for (int k = 1, i; k <= N; k++) {
    i = Order[k];
    int Pos = BinSrh(0, StackTop + 1, X[i]);
    if (T[i] < T[0]) continue;
    F[i] = Pos;
    Stack[Pos] = X[i];
    if (Pos == StackTop + 1) StackTop++;
    if (F[i] > Ans1) Ans1 = F[i];
  }
  F[0] = 0;
  memset(Stack, 0x2f, sizeof Stack);
  Stack[0] = 0xc0c0c0c0c0c0c0c0ll;
  StackTop = 0;
  for (int k = 1, i; k <= N; k++) {
    i = Order[k];
    int Pos = BinSrh(0, StackTop + 1, X[i]);
    F[i] = Pos;
    Stack[Pos] = X[i];
    if (Pos == StackTop + 1) StackTop++;
    if (F[i] > Ans2) Ans2 = F[i];
  }
}
void Output() { printf("%d %d\n", Ans1, Ans2); }
int main() {
  Init();
  Work();
  Output();
  return 0;
}
