/*
 n個(gè)事件,每個(gè)在時(shí)間ti(ti>=1),發(fā)生在坐標(biāo)xi處, 人移動(dòng)的速度是v
 問(wèn)當(dāng)時(shí)間0時(shí)起始位置在0和起始位置任意選時(shí)最多能遇到的事件個(gè)數(shù)
 n <= 100000
 一開(kāi)始我按照時(shí)間排序,然后就是從后往前dp[i] = max{dp[j]} + 1, tj >= ti && |xi-xj| <= v(tj-ti)
 按照時(shí)間排后降了一維,能滿(mǎn)足tj>=ti,然后將|xi-xj| <= v(tj-ti)拆成xi+vti<=xj+vtj, xi-vti>=xj-vtj
 以為能將xi+vti作為線段樹(shù)的軸,然后插入時(shí)是插入xi-vti,和dp[i],發(fā)現(xiàn)會(huì)有問(wèn)題的,
 主要是不同到兩個(gè)事件可能會(huì)有相同到xi+vti,這樣導(dǎo)致線段樹(shù)上到一個(gè)點(diǎn)有兩個(gè)值,更新時(shí)就不確定更新哪個(gè)了
 這個(gè)處理跟2010福州的一題類(lèi)似,通過(guò)對(duì)某個(gè)算出來(lái)的值排序降掉一維,然后再查找算出的另外一個(gè)值
 
http://www.shnenglu.com/Yuan/archive/2010/12/22/137176.html
 
 以上掙扎后還是沒(méi)Gao出.#_#
 
 看了解題報(bào)告,不用對(duì)ti排序!!
 因?yàn)槲覀兪菫榱藵M(mǎn)足|xi-xj| <= v(tj-ti),而滿(mǎn)足這個(gè)不等式的肯定有tj>=ti,所以不用對(duì)ti排序
 以上不等式等價(jià)于:  xi + vti <= xj + vtj , -xi + vti <= -xj + vtj
 令p = xi + vti, q= -xi + vti,按照(p,q)排序,這樣就相當(dāng)于找LIS了,比較的值是q
 要用nlogn的LIS
 
 題中的point0是指坐標(biāo)為0,不是第一個(gè)事件的位置,下標(biāo)是從1開(kāi)始,顯然就不是啦(我一開(kāi)是以為是..T_T)
 還有一個(gè)地方就是,求LIS時(shí)注意=也是成立的!!!
 
 很不錯(cuò)的一道題吧,我一開(kāi)始就陷入先對(duì)ti排序到困局..
 如果能想到滿(mǎn)足|xi-xj| <= v(tj-ti)的必滿(mǎn)足tj>=ti就不用考慮ti了,轉(zhuǎn)去對(duì)p排序
 
*/

#include
<cstdio>
#include
<iostream>
#include
<map>
#include
<algorithm>
#include
<vector>
#include
<cmath>
#include
<cassert>

using namespace std;

const long long INF = 1LL << 60;
const int MAXN = 100086;

struct Event {
    
int t, x;
    
long long p, q;
    
// |xi - xj| <= v(tj-ti)  ,  tj >= ti
    
//=> -v(tj-ti)  <= xi - xj <= v(tj-ti)  , don't need to consider tj >= ti . since this inequality implys
    
//=>  -xi + vti <= -xj + vtj  , xi + vti <= xj + vtj    
    
// let p = x + vt  q = -x + vt
    
// sort by (p,q)

    
void doit(long long v)
    
{
        p 
= x + v*t;
        q 
= -+ v*t;
    }


    
bool operator<(const Event & B)const
    
{
        
if (p != B.p) {
            
return p < B.p;
        }

        
return q < B.q;
    }


    
bool operator ==(const Event & B) const
    
{
        
return x == B.x && t == B.t;
    }

}
;

Event 
event[MAXN];
int dp[MAXN];

inline 
bool boundCmp(const int &a, const int &b)
{
    
return event[a].q > event[b].q;
}


int main()
{
#ifndef ONLINE_JUDGE
    freopen(
"in""r", stdin);
#endif

    
for (int n, v, startX; ~scanf("%d"&n);) {

        
for (int i = 0; i < n; i++{
            scanf(
"%d%d"&event[i].x, &event[i].t);
        }

        scanf(
"%d"&v);
        
for (int i = 0; i < n; i++{
            
event[i].doit(v);
        }

        sort(
eventevent + n);

        
int ans = 0;
        vector
<int> vt;
        
for (int i = n - 1; i >= 0; i--{
            
int pos = upper_bound(vt.begin(), vt.end(), i, boundCmp) - vt.begin();
            dp[i] 
= pos + 1;
            
if (pos == vt.size()) {
                vt.push_back(
0);
            }

            vt[pos] 
= i;
            
if (abs(0 - event[i].x) <= (long long) v * event[i].t) {
                ans 
= max(ans, dp[i]);
            }

        }

        cout 
<< ans << " " << *max_element(dp, dp + n) << endl;
    }

    
return 0;
}