#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
struct node {
  int x, r, q;
  bool operator<(const node &rhs) const { return r > rhs.r; }
} A[N];
int Hash[N], rt[N];
inline int read() {
  int x = 0, flag = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') flag = -1, ch = getchar();
  while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch - '0'), ch = getchar();
  return x * flag;
}
struct Segment_tree {
  int Seg[N * 40], ls[N * 40], rs[N * 40];
  int cnt;
  inline void Modify(int &o, int l, int r, int pos) {
    if (!o) o = ++cnt;
    if (l == r) {
      Seg[o]++;
      return;
    }
    if (pos <= ((l + r) >> 1)) Modify(ls[o], l, ((l + r) >> 1), pos);
    if (pos > ((l + r) >> 1)) Modify(rs[o], ((l + r) >> 1) + 1, r, pos);
    Seg[o] = Seg[ls[o]] + Seg[rs[o]];
  }
  inline int Query(int o, int l, int r, int L, int R) {
    if (!o) return 0;
    if (L <= l && r <= R) return Seg[o];
    int ans = 0;
    if (L <= ((l + r) >> 1)) ans += Query(ls[o], l, ((l + r) >> 1), L, R);
    if (R > ((l + r) >> 1)) ans += Query(rs[o], ((l + r) >> 1) + 1, r, L, R);
    return ans;
  }
} T;
int main() {
  int n = read(), k = read();
  for (int i = (1), iend = (n); i <= iend; i++) {
    int x = read(), r = read(), q = read();
    A[i] = (node){x, r, q};
    Hash[i] = q;
  }
  sort(Hash + 1, Hash + n + 1);
  int cnt = unique(Hash + 1, Hash + n + 1) - Hash - 1;
  for (int i = (1), iend = (n); i <= iend; i++)
    A[i].q = lower_bound(Hash + 1, Hash + cnt + 1, A[i].q) - Hash;
  sort(A + 1, A + n + 1);
  long long ans = 0;
  for (int i = (1), iend = (n); i <= iend; i++) {
    int l = Hash[A[i].q] - k, r = Hash[A[i].q] + k;
    l = lower_bound(Hash + 1, Hash + cnt + 1, l) - Hash;
    r = upper_bound(Hash + 1, Hash + cnt + 1, r) - Hash - 1;
    for (int j = (l), jend = (r); j <= jend; j++)
      ans += T.Query(rt[j], 0, INF, max(0, A[i].x - A[i].r),
                     min(INF, A[i].x + A[i].r));
    T.Modify(rt[A[i].q], 0, INF, A[i].x);
  }
  printf("%lld\n", ans);
  return 0;
}
