#include <bits/stdc++.h>
using namespace std;
#define int long long
int b,n,d,m,cnt;
struct p_2
{
int x,y;
};
struct p_3
{
int x,y,z;
};
bool cmp2(p_2 a,p_2 b)
{
return a.x<b.x;
}
bool cmp3(p_3 a,p_3 b)
{
return a.z<b.z;
}
void solve1()
{
int a[1000005],j=1;
memset(a,0,sizeof(a));
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1; i<=n;i++)
{
while(a[i]-a[j]>d&&j<i)
{
j++;
}
cnt+=i-j;
}
return ;
}
namespace solve2
{
p_2 a[100005];
int bit[75000 * 2];
int lowbit(int x)
{
return x&(-x);
}
void add(int x, int y)
{
while(x<=2*75000)
{
bit[x]+=y;
x+=lowbit(x);
}
}
int sum(int x)
{
x=min(x,(int)(75000*2-1));
int res=0;
while(x>0)
{
res+=bit[x];
x-=lowbit(x);
}
return res;
}
int main()
{
for (int i = 1; i <= n; ++i)
{
int x,y;
cin>>x>>y;
a[i].x=x+y,a[i].y=x-y;
}
sort(a+1,a+n+1,cmp2);
for (int i=1,j=1;i<=n;i++)
{
while (j<i&&a[i].x-a[j].x>d)
{
add(a[j].y+m,-1);
j++;
}
cnt+=sum(a[i].y+d+m)-sum(a[i].y-d-1+m);
add(a[i].y+m,1);
}
return 0;
}
}
namespace solve3
{
p_3 a[100005];
int sum[105][105][80];
int lim(int num)
{
return min((int)(105),max(num,(int)(0)));
}
int cnt_square(int x,int y,int z,int q)
{
return sum[lim(x+d-q)][lim(y+d-q)][lim(z)]-sum[lim(x-d-q)][lim(y)][lim(z)]-sum[lim(x)][lim(y-d-q)][lim(z)]+sum[lim(x-d-q)][lim(y-d-q)][lim(z)];
}
signed main()
{
for (int i=1;i<=n;i++)
{
int x,y,z;
cin>>x>>y>>z;
a[i].x=x+y;
a[i].y=x-y+75;
a[i].z=z;
sum[a[i].x][a[i].y][a[i].z]++;
}
for (int i=1;i<=151;i++)
{
for (int j=1;j<=151;j++)
{
for (int k=1;k<=75;k++)
{
sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];
}
}
}
sort(a+1,a+n+1,cmp3);
for (int i=1;i<=n;i++)
{
for (int j=a[i].z-1;j>=1;j--)
{
cnt+=cnt_square(a[i].x,a[i].y,j,a[i].z-j);
}
}
for (int i=1;i<=n;i++)
{
cnt+=cnt_square(a[i].x,a[i].y,a[i].z,0);
}
return 0;
}
}
signed main()
{
cin>>b>>n>>d>>m;
if (b==1)solve1();
if (b==2)solve2::main();
if (b==3)solve3::main();
cout<<cnt;
return 0;
}