#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e9;
int tree[100010 << 6], ls[100010 << 6], rs[100010 << 6], fa[100010 << 6], tsize;
void add(int& rt, long long l, long long r, long long idx, int val) {
  if (rt == 0) rt = ++tsize;
  if (l == r) {
    tree[rt] += val;
    return;
  }
  long long mid = (l + r) / 2;
  if (idx <= mid)
    add(ls[rt], l, mid, idx, val);
  else
    add(rs[rt], mid + 1, r, idx, val);
  tree[rt] = tree[ls[rt]] + tree[rs[rt]];
}
long long query(int& rt, long long l, long long r, long long L, long long R) {
  if (rt == 0 || L > r || R < l) return 0;
  if (L <= l && r <= R) return tree[rt];
  int mid = (l + r) / 2;
  return query(ls[rt], l, mid, L, R) + query(rs[rt], mid + 1, r, L, R);
}
void init() {
  memset(ls, 0, sizeof(ls));
  memset(rs, 0, sizeof(rs));
  memset(tree, 0, sizeof(tree));
  memset(fa, 0, sizeof(fa));
  tsize = 0;
}
struct Node {
  long long x, r, f;
} no[100010];
int cmp(Node a, Node b) { return a.r > b.r; }
int main() {
  int n, k;
  while (~scanf("%d %d", &n, &k)) {
    init();
    for (int i = 0; i < n; i++) {
      scanf("%lld %lld %lld", &no[i].x, &no[i].r, &no[i].f);
    }
    sort(no, no + n, cmp);
    long long ans = 0;
    for (int i = 0; i < n; i++) {
      long long left = max(no[i].f - k, 1ll);
      long long right = min(no[i].f + k, 10000ll);
      for (int j = left; j <= right; j++) {
        long long ql = max(no[i].x - no[i].r, 1ll);
        long long qr = min(no[i].x + no[i].r, INF);
        ans += query(fa[j], 1, INF, ql, qr);
      }
      add(fa[no[i].f], 1, INF, no[i].x, 1);
    }
    printf("%lld\n", ans);
  }
  return 0;
}
