#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct nod {
  int l, r, len, x, q;
} q[N];
int n, k, tr[N];
int li[N];
long long ans;
bool cmp(nod a, nod b) { return a.len > b.len; }
bool cmp2(nod a, nod b) { return a.q < b.q; }
int lowbit(int x) { return x & -x; }
void add(int x, int v) {
  for (int i = x; i <= n; i += lowbit(i)) {
    tr[i] += v;
  }
}
int query(int x) {
  int res = 0;
  for (int i = x; i; i -= lowbit(i)) {
    res += tr[i];
  }
  return res;
}
void merg_sort(int l, int r) {
  if (l >= r) return;
  int mid = (l + r) / 2;
  merg_sort(l, mid);
  merg_sort(mid + 1, r);
  int L = l, R = l - 1;
  for (int i = mid + 1; i <= r; i++) {
    while (L <= mid && q[i].q - q[L].q > k) add(q[L++].x, -1);
    while (R < mid && q[R + 1].q - q[i].q <= k) add(q[++R].x, 1);
    ans += query(q[i].r) - query(q[i].l - 1);
  }
  for (int i = L; i <= R; i++) add(q[i].x, -1);
  sort(q + l, q + r + 1, cmp2);
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &q[i].x, &q[i].len, &q[i].q);
    li[i] = q[i].x;
  }
  sort(li + 1, li + n + 1);
  int h = unique(li + 1, li + n + 1) - li - 1;
  for (int i = 1; i <= n; i++) {
    q[i].l = lower_bound(li + 1, li + h + 1, q[i].x - q[i].len) - li;
    q[i].r = upper_bound(li + 1, li + h + 1, q[i].x + q[i].len) - li - 1;
    q[i].x = lower_bound(li + 1, li + h + 1, q[i].x) - li;
  }
  sort(q + 1, q + n + 1, cmp);
  merg_sort(1, n);
  printf("%lld\n", ans);
  return 0;
}
