#include <bits/stdc++.h>
using namespace std;
const int MX = 1e5 + 7;
const int mod = 1e9 + 7;
const int N = 1e9;
const int inf = 0x3f3f3f3f;
int n, k, tot;
int root[MX * 40], ls[MX * 40], rs[MX * 40];
long long sum[MX * 40];
struct node {
  int x, r, q;
  bool operator<(const node &A) const { return r > A.r; }
} a[MX];
vector<int> h;
int get_id(int x) { return lower_bound(h.begin(), h.end(), x) - h.begin() + 1; }
void update(int p, int l, int r, int &rt) {
  if (!rt) rt = ++tot;
  sum[rt]++;
  if (l == r) return;
  int m = (l + r) >> 1;
  if (p <= m)
    update(p, l, m, ls[rt]);
  else
    update(p, m + 1, r, rs[rt]);
}
long long query(int L, int R, int l, int r, int rt) {
  if (!rt) return 0;
  if (L <= l && r <= R) return sum[rt];
  int m = (l + r) >> 1;
  long long res = 0;
  if (L <= m) res += query(L, R, l, m, ls[rt]);
  if (R > m) res += query(L, R, m + 1, r, rs[rt]);
  return res;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &a[i].x, &a[i].r, &a[i].q);
    h.push_back(a[i].q);
    h.push_back(a[i].q - k);
    h.push_back(a[i].q + k);
  }
  sort(a + 1, a + n + 1);
  sort(h.begin(), h.end());
  h.erase(unique(h.begin(), h.end()), h.end());
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    int st = a[i].q - k, ed = a[i].q + k;
    st = get_id(st);
    ed = get_id(ed);
    for (int j = st; j <= ed; j++) {
      if (!root[j]) continue;
      int L = max(0, a[i].x - a[i].r), R = min(N, a[i].x + a[i].r);
      ans += query(L, R, 0, N, root[j]);
    }
    a[i].q = get_id(a[i].q);
    update(a[i].x, 0, N, root[a[i].q]);
  }
  cout << ans << endl;
  return 0;
}
