#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5 + 10;
struct robot {
  int x, r, q;
} rob[maxn];
int pos[maxn * 3], tot;
int n, k;
bool cmp(robot a, robot b) { return a.r > b.r; }
int ls[maxn << 5], rs[maxn << 5], sum[maxn << 5];
map<int, int> rt;
int cnt;
void update(int &p, int l, int r, int x) {
  if (!p) p = ++cnt;
  ++sum[p];
  if (l == r) {
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid) update(ls[p], l, mid, x);
  if (x > mid) update(rs[p], mid + 1, r, x);
}
int query(int p, int l, int r, int qx, int qy) {
  if (qx <= l && qy >= r) {
    return sum[p];
  }
  int res = 0;
  int mid = (l + r) >> 1;
  if (qx <= mid) res += query(ls[p], l, mid, qx, qy);
  if (qy > mid) res += query(rs[p], mid + 1, r, qx, qy);
  return res;
}
int getans(int q, int ql, int qr) {
  if (rt.count(q) == 0) return 0;
  return query(rt[q], 1, tot, ql, qr);
}
void ins(int q, int px) {
  if (rt.count(q) == 0) {
    rt[q] = ++cnt;
  }
  update(rt[q], 1, tot, px);
}
int main() {
  scanf("%d%d", &n, &k);
  int maxx = -1;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &rob[i].x, &rob[i].r, &rob[i].q);
    pos[++tot] = rob[i].x;
    pos[++tot] = rob[i].x + rob[i].r;
    pos[++tot] = rob[i].x - rob[i].r;
  }
  sort(pos + 1, pos + 1 + tot);
  tot = unique(pos + 1, pos + 1 + tot) - pos - 1;
  sort(rob + 1, rob + 1 + n, cmp);
  long long res = 0;
  for (int i = 1; i <= n; i++) {
    int l = lower_bound(pos + 1, pos + 1 + tot, rob[i].x - rob[i].r) - pos;
    int r = lower_bound(pos + 1, pos + 1 + tot, rob[i].x + rob[i].r) - pos;
    for (int j = rob[i].q - k; j <= rob[i].q + k; j++) {
      res += getans(j, l, r);
    }
    int z = lower_bound(pos + 1, pos + 1 + tot, rob[i].x) - pos;
    ins(rob[i].q, z);
  }
  printf("%lld\n", res);
}
