#include <bits/stdc++.h>
using namespace std;
#define MAX 100100
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))
template<class X,class Y> bool maximize(X &x,Y y)
{
if(x<y)
{
x=y;
return 1;
}
return 0;
}
template<class X,class Y> bool minimize(X &x,Y y)
{
if(y<x)
{
x=y;
return 1;
}
return 0;
}
const int inf=1e9+412009;
const ll INF=2e18+412009;
int dimension;
namespace ONE_DIMENSION
{
int n,dist,m;
int pos[MAX];
void solve()
{
cin>>n>>dist>>m;
for(int i=1;i<=n;i++) cin>>pos[i];
sort(pos+1,pos+n+1);
ll ans=0;
int T1=1;
for(int i=1;i<=n;i++)
{
while(pos[i]-pos[T1]>dist&&T1<=i) T1++;
if(pos[i]-pos[T1]<=dist) ans+=i-T1;
}
cout<<ans;
}
}
namespace TWO_DIMENSION
{
const int base=77777;
int n,dist,m;
pii a[MAX];
int bit[2*base+100]={};
void update(int x,int val)
{
x+=base;
for(;x<=2*base;x+=x&-x) bit[x]+=val;
}
int get(int x)
{
x+=base;
int res=0;
for(;x>=1;x&=x-1) res+=bit[x];
return res;
}
int get_range(int l,int r)
{
maximize(l,-base);
minimize(r,base);
if(l>r) return 0;
return get(r)-get(l-1);
}
void solve()
{
cin>>n>>dist>>m;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
a[i].fi=x+y;
a[i].se=x-y;
}
sort(a+1,a+n+1);
ll ans=0;
int T1=1;
for(int i=1;i<=n;i++)
{
while(a[i].fi-a[T1].fi>dist&&T1<=i)
{
update(a[T1].se,-1);
T1++;
}
if(a[i].fi-a[T1].fi<=dist) ans+=get_range(a[i].se-dist,a[i].se+dist);
update(a[i].se,1);
}
cout<<ans;
}
}
namespace THREE_DIMENSION
{
const int base=75;
struct POINT
{
int x,y,z;
void input()
{
int _y,_z;
cin>>x>>_y>>_z;
y=_y+_z;
z=_y-_z;
}
};
struct FENWICK_2D
{
int bit[166][166]={};
void update(int x,int y,int val)
{
y+=base;
for(;x<=2*base;x+=x&-x) for(int i=y;i<=2*base;i+=i&-i) bit[x][i]+=val;
}
int get(int x,int y)
{
int res=0;
y+=base;
for(;x>=1;x&=x-1) for(int i=y;i>=1;i&=i-1) res+=bit[x][i];
return res;
}
int get_square(int x1,int y1,int x2,int y2)
{
maximize(x1,1);
maximize(y1,-base);
minimize(x2,2*base);
minimize(y2,base);
if(x1>x2||y1>y2) return 0;
return get(x2,y2)-get(x1-1,y2)-get(x2,y1-1)+get(x1-1,y1-1);
}
};
FENWICK_2D mp[77];
int n,dist,m;
POINT a[MAX];
void solve()
{
cin>>n>>dist>>m;
for(int i=1;i<=n;i++) a[i].input();
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int u=1;u<=m;u++)
{
int newdist=dist-abs(a[i].x-u);
if(newdist<0) continue;
ans+=mp[u].get_square(a[i].y-newdist,a[i].z-newdist,a[i].y+newdist,a[i].z+newdist);
}
mp[a[i].x].update(a[i].y,a[i].z,1);
}
cout<<ans;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>dimension;
if(dimension==1) ONE_DIMENSION::solve();
else if(dimension==2) TWO_DIMENSION::solve();
else THREE_DIMENSION::solve();
return 0;
}