#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 100005 + 7;
const long long MOD = 1e9 + 7;
struct Seg {
  int ls[MAXN * 40], rs[MAXN * 40], sum[MAXN * 40], rt[MAXN * 40], dfn = 0;
  void update(int &o, int nowl, int nowr, int l, int r, int v) {
    if (!o) o = ++dfn;
    if (nowl >= l && nowr <= r) {
      sum[o] += v;
      return;
    }
    int mid = (nowl + nowr) / 2;
    if (l <= mid) update(ls[o], nowl, mid, l, r, v);
    if (r > mid) update(rs[o], mid + 1, nowr, l, r, v);
    sum[o] = sum[ls[o]] + sum[rs[o]];
  }
  int query(int o, int nowl, int nowr, int l, int r) {
    int ans = 0;
    if (nowl >= l && nowr <= r) {
      return sum[o];
    }
    int mid = (nowl + nowr) / 2;
    if (l <= mid) ans += query(ls[o], nowl, mid, l, r);
    if (r > mid) ans += query(rs[o], mid + 1, nowr, l, r);
    return ans;
  }
} seg;
struct Node {
  int x, r, q;
} p[100010];
map<int, int> mp;
int main() {
  int n, k, cnt = 0;
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d %d", &p[i].x, &p[i].r, &p[i].q);
  }
  sort(p + 1, p + 1 + n, [](Node x, Node y) {
    if (x.r != y.r) return x.r > y.r;
    if (x.x != y.x) return x.x < y.x;
    return x.q < y.q;
  });
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    int l = max(0, p[i].x - p[i].r);
    int r = min(1000000000, p[i].x + p[i].r);
    int a = max(0, p[i].q - k), b = p[i].q + k;
    for (int j = a; j <= b; j++) {
      if (mp.find(j) == mp.end()) continue;
      ans += seg.query(seg.rt[mp[j]], 0, 1000000000, l, r);
    }
    if (mp[p[i].q] == 0) mp[p[i].q] = ++cnt;
    seg.update(seg.rt[mp[p[i].q]], 0, 1000000000, p[i].x, p[i].x, 1);
  }
  printf("%lld\n", ans);
}
