#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int M=80050,M1=80,inf=2e9;
void Unique(vector<int>&a){sort(a.begin(),a.end());int m=unique(a.begin(),a.end())-a.begin();a.resize(m);}
int n,D;
void Solve1(){
	int a[n+10];
	for(int i=1;i<=n;i++) scanf("%i",&a[i]);
	sort(a+1,a+n+1);
	ll res=0;
	for(int i=1;i<=n;i++){
		int l=1,r=i,levo=i;
		while(l<=r){
			int mid=l+r>>1;
			if(a[i]-a[mid]<=D){levo=mid;r=mid-1;}
			else l=mid+1;
		}
		res+=i-levo;
	}
	printf("%lld\n",res);
}
struct Bit2d{
	vector<int>Vals[M+50],T[M+50];
	void Init(){for(int i=0;i<=M;i++){Vals[i].pb(-inf);Unique(Vals[i]);T[i].resize(Vals[i].size());}}
	void Ubaci(int i,int j){for(;i<=M;i+=i&-i)Vals[i].pb(j);}
	void Update(int i,int j,int x){for(;i<=M;i+=i&-i)Update1(i,j,x);}
	void Update1(int i,int j,int x){for(int k=upper_bound(Vals[i].begin(),Vals[i].end(),j)-Vals[i].begin()-1;k<Vals[i].size();k+=k&-k)T[i][k]+=x;}
	int Get(int i,int j){int x=0;for(;i>=1;i-=i&-i)x+=Get1(i,j);return x;}
	int Get1(int i,int j){int x=0;for(int k=upper_bound(Vals[i].begin(),Vals[i].end(),j)-Vals[i].begin()-1;k>=1;k-=k&-k)x+=T[i][k];return x;}
	int Get(int l,int L,int r,int R){return Get(L,R)-Get(l-1,R)-Get(L,r-1)+Get(l-1,r-1);}
}bt2[2];
void Solve2(){
	array<int,2>a[n+10];
	for(int i=1;i<=n;i++) scanf("%i%i",&a[i][0],&a[i][1]);
    sort(a+1,a+n+1);
    ll res=0;
    for(int i=1;i<=n;i++){
		int x=a[i][0],y=a[i][1];
		bt2[0].Ubaci(y,x+y);
		bt2[1].Ubaci(y,x-y);
    }
    bt2[0].Init(),bt2[1].Init();
    for(int i=1;i<=n;i++){
		int x=a[i][0],y=a[i][1];
		res+=bt2[0].Get(0,y,x+y-D,inf);
		res+=bt2[1].Get(y+1,M,x-y-D,inf);
		bt2[0].Update(y,x+y,1);
		bt2[1].Update(y,x-y,1);
    }
    printf("%lld\n",res);
}
struct Bit3d{
	vector<int>Vals[M1+2][M1+2],T[M1+2][M1+2];
	void Init(){for(int i=0;i<=M1;i++)for(int j=0;j<=M1;j++){Vals[i][j].pb(-inf);Unique(Vals[i][j]);T[i][j].resize(Vals[i][j].size());}}
	void Ubaci(int i,int j,int k){for(;i<=M1;i+=i&-i)for(int l=j;l<=M1;l+=l&-l)Vals[i][l].pb(k);}
	void Update(int i,int j,int k,int x){for(;i<=M1;i+=i&-i)for(int l=j;l<=M1;l+=l&-l)Update1(i,l,k,x);}
	void Update1(int i,int j,int k,int x){for(int l=upper_bound(Vals[i][j].begin(),Vals[i][j].end(),k)-Vals[i][j].begin()-1;l<Vals[i][j].size();l+=l&-l)T[i][j][l]+=x;}
	int Get(int i,int j,int k){int x=0;for(;i>=1;i-=i&-i)for(int l=j;l>=1;l-=l&-l)x+=Get1(i,l,k);return x;}
	int Get1(int i,int j,int k){int x=0;for(int l=upper_bound(Vals[i][j].begin(),Vals[i][j].end(),k)-Vals[i][j].begin()-1;l>=1;l-=l&-l)x+=T[i][j][l];return x;}
	int Get(int x,int X,int y,int Y,int z,int Z){x--,y--,z--;return Get(X,Y,Z)-Get(x,Y,Z)-Get(X,y,Z)-Get(X,Y,z)+Get(x,y,Z)+Get(x,Y,z)+Get(X,y,z)-Get(x,y,z);}
}bt3[4];
void Solve3(){
	array<int,3>a[n+10];
	for(int i=1;i<=n;i++) scanf("%i%i%i",&a[i][0],&a[i][1],&a[i][2]);
	sort(a+1,a+n+1);
	ll res=0;
	for(int i=1;i<=n;i++){
		int x=a[i][0],y=a[i][1],z=a[i][2];
		bt3[0].Ubaci(y,z,x+y+z);
		bt3[1].Ubaci(y,z,x-y+z);
		bt3[2].Ubaci(y,z,x+y-z);
		bt3[3].Ubaci(y,z,x-y-z);
	}
	for(int i=0;i<4;i++) bt3[i].Init();
	for(int i=1;i<=n;i++){
		int x=a[i][0],y=a[i][1],z=a[i][2];
		res+=bt3[0].Get(0,y,0,z,x+y+z-D,inf);
		res+=bt3[1].Get(y+1,M1,0,z,x-y+z-D,inf);
		res+=bt3[2].Get(0,y,z+1,M1,x+y-z-D,inf);
		res+=bt3[3].Get(y+1,M1,z+1,M1,x-y-z-D,inf);
		bt3[0].Update(y,z,x+y+z,1);
		bt3[1].Update(y,z,x-y+z,1);
		bt3[2].Update(y,z,x+y-z,1);
		bt3[3].Update(y,z,x-y-z,1);
	}
	printf("%lld\n",res);
}
int main(){
    int B,mm;scanf("%i%i%i%i",&B,&n,&D,&mm);
    if(B==1)Solve1();
    if(B==2)Solve2();
    if(B==3)Solve3();
    return 0;
}
Compilation message (stderr)
pairs.cpp: In function 'void Solve1()':
pairs.cpp:13:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |         for(int i=1;i<=n;i++) scanf("%i",&a[i]);
      |                               ~~~~~^~~~~~~~~~~~
pairs.cpp: In function 'void Solve2()':
pairs.cpp:39:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |         for(int i=1;i<=n;i++) scanf("%i%i",&a[i][0],&a[i][1]);
      |                               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'void Solve3()':
pairs.cpp:69:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         for(int i=1;i<=n;i++) scanf("%i%i%i",&a[i][0],&a[i][1],&a[i][2]);
      |                               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'int main()':
pairs.cpp:94:19: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |     int B,mm;scanf("%i%i%i%i",&B,&n,&D,&mm);
      |              ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |