#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int n, k;
map<int, int> root;
int cnt, sum[maxn << 2];
struct node {
  int x, r, q;
  friend bool operator<(const node &a, const node &b) { return a.r > b.r; }
} a[maxn << 2];
struct tree {
  int l, r;
} t[maxn << 2];
void update(int &x, int l, int r, int pos) {
  if (!x) x = ++cnt;
  ++sum[x];
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (pos <= mid)
    update(t[x].l, l, mid, pos);
  else
    update(t[x].r, mid + 1, r, pos);
}
int query(int x, int l, int r, int ql, int qr) {
  if (!x) return 0;
  if (ql <= l && qr >= r) return sum[x];
  int mid = (l + r) >> 1;
  if (qr <= mid)
    return query(t[x].l, l, mid, ql, qr);
  else if (ql > mid)
    return query(t[x].r, mid + 1, r, ql, qr);
  else
    return query(t[x].l, l, mid, ql, qr) + query(t[x].r, mid + 1, r, ql, qr);
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &a[i].x, &a[i].r, &a[i].q);
  }
  sort(a + 1, a + n + 1);
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = max(a[i].q - k, 0); j <= min(1000000000, a[i].q + k); j++) {
      ans += query(root[j], 1, 1000000000, a[i].x - a[i].r, a[i].x + a[i].r);
    }
    update(root[a[i].q], 1, 1000000000, a[i].x);
  }
  printf("%lld\n", ans);
  return 0;
}
