#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
char rB[1 << 21], *S, *T;
inline char gc() {
  return S == T && (T = (S = rB) + fread(rB, 1, 1 << 21, stdin), S == T) ? EOF
                                                                         : *S++;
}
inline int rd() {
  char c = gc();
  while (c < 48 || c > 57) c = gc();
  int x = c & 15;
  for (c = gc(); c >= 48 && c <= 57; c = gc())
    x = (x << 3) + (x << 1) + (c & 15);
  return x;
}
struct node {
  int x, r, q;
} a[N];
int cnt[N << 5], lc[N << 5], rc[N << 5], rt[N], sz = 0, b[N], x, y;
inline bool cmp(node a, node b) { return a.r > b.r; }
void add(int &o, int L, int R) {
  if (!o) o = ++sz;
  ++cnt[o];
  if (L < R) {
    int M = L + R >> 1;
    if (x <= M)
      add(lc[o], L, M);
    else
      add(rc[o], M + 1, R);
  }
}
int query(int o, int L, int R) {
  if (!o) return 0;
  if (x <= L && y >= R) return cnt[o];
  int M = L + R >> 1, ans = 0;
  if (x <= M) ans = query(lc[o], L, M);
  if (y > M) ans += query(rc[o], M + 1, R);
  return ans;
}
int main() {
  int n = rd(), k = rd(), m, i, j, p;
  long long ans = 0;
  for (i = 1; i <= n; ++i) {
    a[i].x = rd();
    a[i].r = rd();
    b[i] = a[i].q = rd();
  }
  sort(b + 1, b + n + 1);
  m = unique(b + 1, b + n + 1) - b - 1;
  sort(a + 1, a + n + 1, cmp);
  for (i = 1; i <= n; ++i) {
    p = lower_bound(b + 1, b + m + 1, a[i].q) - b;
    x = a[i].x - a[i].r;
    y = a[i].x + a[i].r;
    for (j = p; j && b[p] - b[j] <= k; --j) ans += query(rt[j], 0, 1000000000);
    for (j = p + 1; j <= m && b[j] - b[p] <= k; ++j)
      ans += query(rt[j], 0, 1000000000);
    x = a[i].x;
    add(rt[p], 0, 1000000000);
  }
  printf("%I64d", ans);
  return 0;
}
