#include <bits/stdc++.h>
using namespace std;
const double pi = 2 * acos(0.0);
const int maxn = 1e5 + 5;
const int maxm = 4e5 + 10;
const int mod = 1e9 + 7;
map<int, int> mp;
int cnt = 0;
int m = 0;
int L[maxn * 20], R[maxn * 20];
int b[maxn * 3];
int sum[maxn * 20];
long long ans = 0;
struct node {
  int x, r, q;
  bool operator<(const node A) const { return r > A.r; }
} a[maxn];
void update(int rt, int l, int r, int x) {
  sum[rt]++;
  if (l == r) return;
  int mid = (l + r) / 2;
  if (x <= mid)
    update(L[rt] = L[rt] ? L[rt] : ++cnt, l, mid, x);
  else
    update(R[rt] = R[rt] ? R[rt] : ++cnt, mid + 1, r, x);
}
int query(int rt, int l, int r, int ql, int qr) {
  if (l >= ql && r <= qr || rt == 0) return sum[rt];
  int mid = (l + r) / 2;
  int ans = 0;
  if (ql <= mid) ans += query(L[rt], l, mid, ql, qr);
  if (qr > mid) ans += query(R[rt], mid + 1, r, ql, qr);
  return ans;
}
void ins(int q, int x) {
  if (!mp.count(q)) mp[q] = ++cnt;
  update(mp[q], 1, m, x);
}
int get(int q, int l, int r) {
  if (!mp.count(q)) return 0;
  return query(mp[q], 1, m, l, r);
}
int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &a[i].x, &a[i].r, &a[i].q);
    b[++m] = a[i].x - a[i].r;
    b[++m] = a[i].x;
    b[++m] = a[i].x + a[i].r;
  }
  sort(a + 1, a + 1 + n);
  sort(b + 1, b + 1 + m);
  m = unique(b + 1, b + 1 + m) - (b + 1);
  for (int i = 1; i <= n; i++) {
    int l = lower_bound(b + 1, b + m + 1, a[i].x - a[i].r) - b;
    int r = lower_bound(b + 1, b + 1 + m, a[i].x + a[i].r) - b;
    int x = lower_bound(b + 1, b + 1 + m, a[i].x) - b;
    for (int j = a[i].q - k; j <= a[i].q + k; j++) {
      ans += get(j, l, r);
    }
    ins(a[i].q, x);
  }
  printf("%lld\n", ans);
  return 0;
}
