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

import java.util.Arrays;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;

public class Main {

    /**
     * @param args
     */

    public static long vel;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Event[] events = new Event[n];
        for (int i = 0; i < n; i++) {
            Event e = new Event(sc.nextLong(), sc.nextLong());
            events[i] = e;
        }
        //Arrays.sort(events);
        vel = sc.nextLong();
        // test
        /*
         * for (int i = 0; i < events.length; i++) {
         * System.out.println(events[i].pos); }
         */
        Pdd[] pdd = new Pdd[n];
        for (int i = 0; i < n; i++) {
            Event event=events[i];
            long xl = event.pos - vel * event.time;
            long xr = event.pos + vel * event.time;
            pdd[i] = new Pdd(xl, -xr);
        }
        Arrays.sort(pdd);

        int ret1 = findmostlong2(pdd);
        int ret2 = findmostlong(pdd);
        printFormat("%d %d", ret1, ret2);

        // System.out.println(Arrays.toString(events));

        // TODO Auto-generated method stub

    }

    public static int findmostlong(Pdd[] pdd) {
        SortedSet<Pdd> ps = new TreeSet<Pdd>();
        ps.clear();
        for (int i = 0; i < pdd.length; i++) {
            long x = pdd[i].x;
            long y = pdd[i].y;
            if (x + y > 0)
                continue;
            Pdd pd=new Pdd(y,x);
            SortedSet<Pdd> tail = ps.tailSet(pd);
            if (!tail.isEmpty())
                ps.remove(tail.first());
            ps.add(pd);
        }
        return ps.size();
    }

    public static int findmostlong2(Pdd[] pdd) {
        SortedSet<Pdd> ps = new TreeSet<Pdd>();
        ps.clear();
        for (int i = 0; i < pdd.length; i++) {
            long x = pdd[i].x;
            long y = pdd[i].y;
            if (x + y > 0 || x > 0 || y > 0)
                continue;
            Pdd pd=new Pdd(y,x);
            SortedSet<Pdd> tail = ps.tailSet(pd);
            if (!tail.isEmpty())
                ps.remove(tail.first());
            ps.add(pd);
        }
        return ps.size();
    }

    static class Pdd implements Comparable<Pdd> {
        long x;
        long y;

        Pdd(long x, long y) {
            this.x = x;
            this.y = y;
        }

        public int compareTo(Pdd pdd) {
            long z = this.x - pdd.x;
            if (z < 0)
                return -1;
            else if (z > 0)
                return 1;
            else {
                z = this.y - pdd.y;
                if (z < 0)
                    return -1;
                else if (z > 0)
                    return 1;
                else
                    return 0;
            }
        }
    }

    static class Event implements Comparable<Event> {
        long time;
        long pos;

        Event(long pos, long time) {
            this.time = time;
            this.pos = pos;
        }

        public int compareTo(Event event) {
            long z = this.time - event.time;
            if (z < 0)
                return -1;
            else if (z > 0)
                return 1;
            else {
                return 0;
            }
        }
    }

    public static void printFormat(String format, Object... args) {
        System.out.println(String.format(format, args));
    }

}
