#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct Query {
  int x, r, q, X, L, R;
  bool operator<(const Query& rhs) const { return r < rhs.r; }
} Q[maxn];
int n, k, sz = 0, c[maxn * 3], a[maxn * 3];
long long ans = 0;
int low(int x) { return x & (-x); }
void update(int x, int v) {
  while (x <= sz) {
    c[x] += v;
    x += low(x);
  }
}
long long query(int x) {
  if (x <= 0) return 0;
  long long res = 0;
  while (x) {
    res += c[x];
    x -= low(x);
  }
  return res;
}
bool cmp(Query t1, Query t2) { return t1.q < t2.q; }
void cdq(int l, int r) {
  if (l == r) return;
  int m = (l + r) / 2;
  cdq(l, m), cdq(m + 1, r);
  int p = m + 1, q = m + 1;
  for (int i = l; i <= m; i++) {
    while (q <= r && Q[q].q <= Q[i].q + k) update(Q[q].X, 1), q++;
    while (p <= r && Q[p].q < Q[i].q - k) update(Q[p].X, -1), p++;
    ans += query(Q[i].R) - query(Q[i].L - 1);
  }
  for (int i = p; i < q; i++) update(Q[i].X, -1);
  inplace_merge(Q + l, Q + m + 1, Q + r + 1, cmp);
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &Q[i].x, &Q[i].r, &Q[i].q);
    a[++sz] = Q[i].x - Q[i].r;
    a[++sz] = Q[i].x;
    a[++sz] = Q[i].x + Q[i].r;
  }
  sort(a + 1, a + 1 + sz);
  sz = unique(a + 1, a + 1 + sz) - a - 1;
  for (int i = 1; i <= n; i++) {
    Q[i].X = lower_bound(a + 1, a + 1 + sz, Q[i].x) - a;
    Q[i].L = lower_bound(a + 1, a + 1 + sz, Q[i].x - Q[i].r) - a;
    Q[i].R = lower_bound(a + 1, a + 1 + sz, Q[i].x + Q[i].r) - a;
  }
  sort(Q + 1, Q + 1 + n);
  cdq(1, n);
  printf("%I64d\n", ans);
}
