#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
char buf[1 << 21], *p1 = buf, *p2 = buf;
template <typename T>
inline void read(T &x) {
  static char ch;
  bool f = 1;
  for (x = 0,
      ch = (p1 == p2 &&
                    (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                ? EOF
                : *p1++);
       !isdigit(ch);
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    if (ch == '-') f = 0;
  for (; isdigit(ch);
       x = (x << 1) + (x << 3) + ch - 48,
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    ;
  x = f ? x : -x;
}
map<long long, long long> gen;
struct node {
  long long x, r, q;
  bool operator<(const node &x) const { return r > x.r; }
} a[100001];
long long n, k, len1, L[4000001], R[4000001], maxx;
long long tot, dat[4000001];
void ins(long long &q, long long l1, long long r1, long long point) {
  if (!q) q = ++len1;
  if (l1 == r1) {
    ++dat[q];
    return;
  }
  long long mid = l1 + r1 >> 1;
  if (point <= mid)
    ins(L[q], l1, mid, point);
  else
    ins(R[q], mid + 1, r1, point);
  dat[q] = dat[L[q]] + dat[R[q]];
}
long long ask(long long q, long long l1, long long r1, long long l,
              long long r) {
  if (!q || r < l1 || r1 < l) return 0;
  if (l <= l1 && r1 <= r) return dat[q];
  long long mid = l1 + r1 >> 1;
  return ask(L[q], l1, mid, l, r) + ask(R[q], mid + 1, r1, l, r);
}
signed main() {
  read(n), read(k);
  for (register long long i = 1; i <= n; ++i)
    read(a[i].x), read(a[i].r), read(a[i].q),
        maxx = maxx > a[i].q + k ? maxx : a[i].q + k,
        maxx = maxx > a[i].x + a[i].r ? maxx : a[i].x + a[i].r;
  sort(a + 1, a + 1 + n);
  for (register long long i = 1; i <= n; ++i) {
    for (register long long j = (a[i].q - k > 0 ? a[i].q - k : 0);
         j <= (a[i].q + k < maxx ? a[i].q + k : maxx); ++j)
      tot += ask(gen[j], 0, maxx, a[i].x - a[i].r > 0 ? a[i].x - a[i].r : 0,
                 a[i].x + a[i].r < maxx ? a[i].x + a[i].r : maxx);
    ins(gen[a[i].q], 0, maxx, a[i].x);
  }
  printf("%lld\n", tot);
  return 0;
}
