#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
static long long ans;
static int N, K, D, pos[MAXN], val[MAXN], lft[MAXN], rgt[MAXN], num[MAXN << 2],
    dsc[MAXN << 2];
static pair<int, int> bot[MAXN];
inline int get_dsc(int x) { return lower_bound(dsc, dsc + D, x) - dsc + 1; }
inline int lowbit(int x) { return x & -x; }
inline void modify(int p, int x) {
  for (int i = p; i <= D; i += lowbit(i)) num[i] += x;
}
inline int query(int p) {
  int ans = 0;
  for (int i = p; i; i -= lowbit(i)) ans += num[i];
  return ans;
}
void solve(int l, int r) {
  if (l >= r) return;
  int lm = (l + r) / 2, rm = lm + 1, fl = rm, fr = rm;
  solve(l, lm);
  solve(rm, r);
  for (int i = l; i <= lm; i++) {
    while (fl <= r && val[bot[fl].second] < val[bot[i].second] - K)
      modify(pos[bot[fl++].second], -1);
    while (fr <= r && val[bot[fr].second] <= val[bot[i].second] + K)
      modify(pos[bot[fr++].second], +1);
    ans += query(rgt[bot[i].second]) - query(lft[bot[i].second] - 1);
  }
  while (fl < fr) modify(pos[bot[fl++].second], -1);
  static pair<int, int> tmp[MAXN];
  int i = l, pl = l, pr = rm;
  while (pl <= lm && pr <= r) {
    if (val[bot[pl].second] < val[bot[pr].second])
      tmp[i++] = bot[pl++];
    else
      tmp[i++] = bot[pr++];
  }
  while (pl <= lm) tmp[i++] = bot[pl++];
  while (pr <= r) tmp[i++] = bot[pr++];
  for (int j = l; j <= r; j++) bot[j] = tmp[j];
}
int main() {
  scanf("%d%d", &N, &K);
  for (int i = 0, rad; i < N; i++) {
    scanf("%d%d%d", &pos[i], &rad, &val[i]);
    dsc[D++] = pos[i];
    dsc[D++] = lft[i] = pos[i] - rad;
    dsc[D++] = rgt[i] = pos[i] + rad;
    bot[i] = make_pair(rad, i);
  }
  sort(dsc, dsc + D);
  sort(bot, bot + N);
  D = unique(dsc, dsc + D) - dsc;
  for (int i = 0; i < N; i++) {
    pos[i] = get_dsc(pos[i]);
    lft[i] = get_dsc(lft[i]);
    rgt[i] = get_dsc(rgt[i]);
  }
  solve(0, N - 1);
  printf("%lld\n", ans);
  return 0;
}
