// duonglaptrinh
# include <bits/stdc++.h>
# define pa pair<int, int>
# define paa pair<int, pair<int, int>>
# define fi first
# define se second
using namespace std;
const int N = 1e5+5;
int n, d, limit;
namespace type1 {
int a[N];
void solve() {
cin>>n>>d>>limit;
for(int i = 1; i <= n; i++) {
cin>>a[i];
}
sort(a + 1, a + 1 + n);
long long ans = 0;
for(int i = 1; i <= n; i++) {
int l = lower_bound(a + 1, a + 1 + n, a[i] - d) - a;
int r = upper_bound(a + 1, a + 1 + n, a[i] + d) - a;
ans += (r - l - 1);
}
cout<<ans / 2;
}
}
int bit[2 * N];
namespace type2 {
void update(int vt, int gt) {
for(int i = vt; i <= limit; i += (i & (-i))) {
bit[i] += gt;
}
}
int get(int l, int r) {
l = max(l - 1, 0), r = min(r, limit);
int ans = 0;
for(int i = l; i >= 1; i -= (i & (-i))) {
ans -= bit[i];
}
for(int i = r; i >= 1; i -= (i & (-i))) {
ans += bit[i];
}
return ans;
}
pa a[N];
void solve() {
cin>>n>>d>>limit;
limit = limit * 2;
for(int i = 1; i <= n; i++) {
cin>>a[i].fi>>a[i].se;
}
sort(a + 1, a + 1 + n, [] (pa x, pa y) {return (x.fi - x.se) < (y.fi - y.se);});
int l = 1, r = 1;
long long ans = 0;
for(int i = 1; i <= n; i++) {
while(l <= n && abs((a[i].fi - a[i].se) - (a[l].fi - a[l].se)) > d) {
update(abs(a[l].fi + a[l].se), -1);
l++;
}
while(r <= n && abs((a[i].fi - a[i].se) - (a[r].fi - a[r].se)) <= d) {
update(abs(a[r].fi + a[r].se), 1);
r++;
}
ans += get(abs(a[i].fi + a[i].se) - d, abs(a[i].fi + a[i].se) + d) - 1;
}
cout<<ans / 2;
}
}
namespace type3 {
void update(int vt, int gt) {
for(int i = vt; i <= limit * 2; i += (i & (-i))) {
bit[i] += gt;
}
}
int get(int l, int r) {
l = max(l - 1, 0), r = min(r, limit * 2);
int ans = 0;
for(int i = l; i >= 1; i -= (i & (-i))) {
ans -= bit[i];
}
for(int i = r; i >= 1; i -= (i & (-i))) {
ans += bit[i];
}
return ans;
}
paa a[N];
pa vitri[N];
void solve() {
cin>>n>>d>>limit;
for(int i = 1; i <= n; i++) {
cin>>a[i].fi>>a[i].se.fi>>a[i].se.se;
}
sort(a + 1, a + 1 + n, [] (paa x, paa y) {
if(x.fi != y.fi) {
return x.fi < y.fi;
}
return (x.se.fi - x.se.se) < (y.se.fi - y.se.se);
});
for(int i = 1; i <= n; i++) {
if(vitri[a[i].fi].fi == 0) {
vitri[a[i].fi].fi = i;
}
vitri[a[i].fi].se = i;
}
long long ans = 0;
for(int ii = 1; ii <= limit; ii++) {
if(!vitri[ii].fi) {
continue;
}
// cout<<vitri[ii].fi<<" "<<vitri[ii].se<<"\n";
for(int jj = 1; jj <= limit; jj++) {
if(!vitri[jj].fi) {
continue;
}
// cout<<vitri[jj].fi<<" "<<vitri[jj].se<<"\n";
int l = vitri[jj].fi, r = vitri[jj].fi, dd = d - abs(ii - jj);
if(dd < 0) {
continue;
}
for(int i = vitri[ii].fi; i <= vitri[ii].se; i++) {
while(l <= vitri[jj].se && abs((a[i].se.fi - a[i].se.se) - (a[l].se.fi - a[l].se.se)) > dd) {
update(a[l].se.fi + a[l].se.se, -1 * (l < r));
l++;
}
r = max(r, l);
while(r <= vitri[jj].se && abs((a[i].se.fi - a[i].se.se) - (a[r].se.fi - a[r].se.se)) <= dd) {
update(a[r].se.fi + a[r].se.se, 1);
r++;
}
ans += get(abs(a[i].se.fi + a[i].se.se) - dd, abs(a[i].se.fi + a[i].se.se) + dd);
// cout<<l<<" "<<r<<" "<<get(abs(a[i].se.fi + a[i].se.se) - dd, abs(a[i].se.fi + a[i].se.se) + dd)<<"\n";
}
// cout<<"\n";
while(l < r) {
update(a[l].se.fi + a[l].se.se, -1 * (l < r));
l++;
}
}
// cout<<"\n";
}
ans -= n;
cout<<ans / 2;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int type;
cin>>type;
if(type == 1) {
type1::solve();
return 0;
}
if(type == 2) {
type2::solve();
return 0;
}
if(type == 3) {
type3::solve();
return 0;
}
return 0;
}