#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void rd(T &x) {
  x = 0;
  T f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') f = ch == '-' ? -1 : 1, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  x *= f;
}
const int N = 100005;
struct node {
  int x, r, q, lp, rp;
  inline bool operator<(const node &n1) const { return r > n1.r; }
} a[N], tp[N];
int n, k, b[N], cnt, s[N];
long long ans;
inline void add(int p, int val) {
  for (; p <= cnt; p += p & -p) s[p] += val;
}
inline int query(int p) {
  int res = 0;
  for (; p; p -= p & -p) res += s[p];
  return res;
}
void solve(int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1;
  solve(l, mid), solve(mid + 1, r);
  int L = l, R = L;
  for (int i = mid + 1, I = (r) + 1; i < I; ++i) {
    while (L <= mid && a[i].q - a[L].q > k) add(a[L++].x, -1);
    while (R <= mid && a[R].q - a[i].q <= k) add(a[R++].x, 1);
    ans += query(a[i].rp) - query(a[i].lp - 1);
  }
  for (int i = L, I = (R - 1) + 1; i < I; ++i) add(a[i].x, -1);
  L = l, R = mid + 1;
  for (int i = l, I = (r) + 1; i < I; ++i) {
    if (L > mid || (R <= r && a[L].q > a[R].q))
      tp[i] = a[R++];
    else
      tp[i] = a[L++];
  }
  for (int i = l, I = (r) + 1; i < I; ++i) a[i] = tp[i];
}
int main() {
  rd(n), rd(k);
  for (int i = 1, I = (n) + 1; i < I; ++i) {
    rd(a[i].x), rd(a[i].r), rd(a[i].q);
    b[i] = a[i].x;
  }
  sort(b + 1, b + n + 1), sort(a + 1, a + n + 1);
  cnt = unique(b + 1, b + n + 1) - b - 1;
  for (int i = 1, I = (n) + 1; i < I; ++i) {
    a[i].lp = lower_bound(b + 1, b + cnt + 1, max(a[i].x - a[i].r, b[1])) - b;
    a[i].rp = upper_bound(b + 1, b + cnt + 1, a[i].x + a[i].r) - b - 1;
    a[i].x = lower_bound(b + 1, b + cnt + 1, a[i].x) - b;
  }
  solve(1, n);
  cout << ans;
}
