#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5;
const long long max_n = 4e6;
const long long C = 1e9;
long long rt[max_n], lson[max_n], rson[max_n], sum[max_n];
long long id, cnt;
struct T {
  long long x, r, iq;
  bool operator<(const T &a) const { return r > a.r; }
};
vector<T> v;
map<long long, long long> mp;
void update(long long &p, long long l, long long r, long long x) {
  if (!p) p = ++id;
  sum[p]++;
  if (l == r) return;
  long long m = l + r >> 1;
  if (x <= m)
    update(lson[p], l, m, x);
  else
    update(rson[p], m + 1, r, x);
}
long long query(long long p, long long l, long long r, long long L,
                long long R) {
  if (!p) return 0;
  if (L <= l and r <= R) {
    return sum[p];
  }
  long long m = l + r >> 1, ans = 0;
  if (L <= m) ans += query(lson[p], l, m, L, R);
  if (R > m) ans += query(rson[p], m + 1, r, L, R);
  return ans;
}
inline void latina() {
  long long n, k;
  cin >> n >> k;
  v.resize(n);
  for (long long i = 0; i < n; ++i) {
    cin >> v[i].x >> v[i].r >> v[i].iq;
    if (mp[v[i].iq] == 0) mp[v[i].iq] = ++cnt;
  }
  sort((v).begin(), (v).end());
  long long ans = 0;
  for (auto &c : v) {
    long long rad, l, r, L, R;
    rad = c.r, l = max(0ll, c.iq - k), r = min(C, c.iq + k);
    L = max(0ll, c.x - rad), R = min(C, c.x + rad);
    for (long long i = l; i <= r; ++i) {
      if (mp.find(i) == mp.end()) continue;
      ans += query(rt[mp[i]], 1, C, L, R);
    }
    update(rt[mp[c.iq]], 1, C, c.x);
  }
  cout << ans << '\n';
}
signed main() {
  ios::sync_with_stdio(false), cin.tie(0);
  ;
  latina();
}
