#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct a {
  int p, e, q;
} rob[N];
int un1[N], un2[N];
int root[N], val[18 * N], son[18 * N][2];
int n, m, l1, l2, cnt, tot;
long long ans;
bool cmp(a x, a y) { return x.e > y.e; }
void add(int &nde, int l, int r, int pos) {
  if (!nde) nde = ++tot;
  val[nde]++;
  if (l == r) return;
  int mid = (l + r) / 2;
  if (pos <= mid)
    add(son[nde][0], l, mid, pos);
  else
    add(son[nde][1], mid + 1, r, pos);
}
long long query(int nde, int l, int r, int nl, int nr) {
  if (!nde) return 0;
  if (l >= nl && r <= nr) return val[nde];
  int mid = (l + r) / 2;
  long long ret = 0;
  if (nl <= mid) ret += query(son[nde][0], l, mid, nl, nr);
  if (mid < nr) ret += query(son[nde][1], mid + 1, r, nl, nr);
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &rob[i].p, &rob[i].e, &rob[i].q);
    un1[i] = rob[i].p, un2[i] = rob[i].q;
  }
  sort(rob + 1, rob + 1 + n, cmp);
  sort(un1 + 1, un1 + 1 + n), l1 = unique(un1 + 1, un1 + 1 + n) - un1 - 1;
  sort(un2 + 1, un2 + 1 + n), l2 = unique(un2 + 1, un2 + 1 + n) - un2 - 1;
  for (int i = 1; i <= n; i++) {
    rob[i].p = lower_bound(un1 + 1, un1 + 1 + l1, rob[i].p) - un1;
    rob[i].q = lower_bound(un2 + 1, un2 + 1 + l2, rob[i].q) - un2;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = -m; j <= m; j++) {
      int pos = lower_bound(un2 + 1, un2 + 1 + l2, un2[rob[i].q] + j) - un2;
      int ll =
          lower_bound(un1 + 1, un1 + 1 + l1, un1[rob[i].p] - rob[i].e) - un1;
      int rr = upper_bound(un1 + 1, un1 + 1 + l1, un1[rob[i].p] + rob[i].e) -
               un1 - 1;
      if (un2[pos] == un2[rob[i].q] + j) ans += query(root[pos], 1, l1, ll, rr);
    }
    add(root[rob[i].q], 1, l1, rob[i].p);
  }
  printf("%lld", ans);
  return 0;
}
