#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, r, q;
  bool operator<(const node &p) const { return r > p.r; }
} a[100001];
int n, k;
int ch[100001 << 6][2], sum[100001 << 6], tot;
unordered_map<int, int> root;
inline void insert(int &p, int l, int r, int kkk) {
  if (p == 0) p = ++tot;
  sum[p]++;
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (kkk <= mid) insert(ch[p][0], l, mid, kkk);
  if (kkk > mid) insert(ch[p][1], mid + 1, r, kkk);
}
inline int query(int p, int l, int r, int ql, int qr) {
  if (p == 0) return 0;
  if (ql <= l && qr >= r) return sum[p];
  int mid = (l + r) >> 1, ans = 0;
  if (ql <= mid) ans += query(ch[p][0], l, mid, ql, qr);
  if (qr > mid) ans += query(ch[p][1], mid + 1, r, ql, qr);
  return ans;
}
inline void init() {
  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);
}
int main() {
  init();
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    int Q = a[i].q, R = a[i].r;
    for (int j = Q - k; j <= Q + k; j++)
      ans += query(root[j], 1, 1000000000, max(a[i].x - R, 0),
                   min(a[i].x + R, 1000000000));
    insert(root[Q], 1, 1000000000, a[i].x);
  }
  cout << ans;
  return 0;
}
