#include<bits/stdc++.h>
using namespace std;
struct point { int x,y,z; };
struct query { int t,l,r,v; };
const int MAXN=183667;
int fen[MAXN],pref[77][177][177],A[MAXN];
vector<query> vq[MAXN];
point P[MAXN];
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int b,n,d,m;
cin>>b>>n>>d>>m;
if(b==1)
{
for(int i=1;i<=n;i++) cin>>A[i];
sort(A+1,A+n+1);
long long ans=0;
for(int i=1;i<=n;i++) ans+=upper_bound(A+1,A+n+1,A[i]+d)-A-i-1;
cout<<ans;
}
else if(b==2)
{
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
int u=x-y+m,v=x+y;
vq[u].push_back({1,v,1,1});
vq[max(1,u-d)-1].push_back({2,max(1,v-d),min(m*2,v+d),-1});
vq[min(m*2,u+d)].push_back({2,max(1,v-d),min(m*2,v+d),1});
}
long long ans=0;
for(int i=1;i<=m*2;i++)
{
for(auto v:vq[i]) if(v.t==1) update(v.l,m*2,1);
for(auto v:vq[i]) if(v.t==2) ans+=(get(v.r)-get(v.l-1))*v.v;
}
cout<<(ans-n)/2;
}
else
{
for(int i=1;i<=n;i++)
{
int x,y,z;
cin>>x>>y>>z;
P[i]={x,y-z+m,y+z};
pref[x][P[i].y][P[i].z]++;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m*2;j++) for(int k=1;k<=m*2;k++) pref[i][j][k]+=pref[i][j-1][k];
for(int j=1;j<=m*2;j++) for(int k=1;k<=m*2;k++) pref[i][j][k]+=pref[i][j][k-1];
}
long long ans=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{
int z=d-abs(j-P[i].x);
if(z>=0)
{
ans+=pref[j][min(m*2,P[i].y+z)][min(m*2,P[i].z+z)];
ans-=pref[j][max(1,P[i].y-z)-1][min(m*2,P[i].z+z)];
ans-=pref[j][min(m*2,P[i].y+z)][max(1,P[i].z-z)-1];
ans+=pref[j][max(1,P[i].y-z)-1][max(1,P[i].z-z)-1];
}
}
cout<<(ans-n)/2;
}
}