#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct pd{
int x,y;//x表示坐标,y表示高度
}a[100001];
pd stk[100001];
bool q[100001],h[100001];//q[i]用来存储在点的左边拥挤的个数,h[i]存储右边拥挤个数
inline bool cmp(pd a,pd b)
{
return a.x < b.x;
}
int main()
{
int n,d;scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
int hh=1,tt=0;
for(int i=1;i<=n;i++)//判断每头牛的左边是否存才比它高两倍的牛
{
while(hh <= tt && stk[tt].y < a[i].y) tt--;
stk[++tt]=a[i];
while(hh <= tt && stk[hh].x < a[i].x-d) hh++;
if(stk[hh].y>=a[i].y*2)q[i]=1;
}
memset(stk,0,sizeof stk);
hh=1; tt=0;
for(int i=n;i;i--)//判断每头牛的右边是否存才比它高两倍的牛
{
while(hh <= tt && stk[tt].y < a[i].y) tt--;
stk[++tt]=a[i];
while(hh <= tt && stk[hh].x > a[i].x+d) hh++;
if(stk[hh].y >= a[i].y*2) h[i]=1;
}
int ans=0;
for(int i=1;i<=n;i++)if(q[i]&&h[i])ans++;//如果这头牛两边都有比它高两倍的就会觉得拥挤
printf("%d",ans);
return 0;
}