#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
struct robot {
  int x, r, q, id;
} a[N];
bool cmp(robot x, robot y) { return x.r > y.r; }
bool cmpq(robot x, robot y) { return x.q < y.q; }
int n, k, b[N], tot;
long long tr[N], ans;
int lb(int x) { return x & (-x); }
void add(int x, int p) {
  for (; x <= n + 3; x += lb(x)) tr[x] += p;
}
long long ask(int x) {
  long long ans = 0;
  for (; x; x -= lb(x)) ans += tr[x];
  return ans;
}
void slove(int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1, s = l, t = l;
  slove(l, mid), slove(mid + 1, r);
  sort(a + l, a + mid + 1, cmpq);
  sort(a + mid + 1, a + r + 1, cmpq);
  for (int i = mid + 1; i <= r; i++) {
    while (a[i].q - a[s].q > k && s <= mid)
      if (s < t)
        add(a[s].id, -1), s++;
      else
        s++, t = s;
    while (abs(a[i].q - a[t].q) <= k && t <= mid) add(a[t].id, 1), t++;
    int x = lower_bound(b + 1, b + tot + 1, a[i].x - a[i].r) - b,
        y = lower_bound(b + 1, b + tot + 1, a[i].x + a[i].r) - b;
    while (b[x] >= a[i].x - a[i].r && x > 0) x--;
    while (b[y] > a[i].x + a[i].r) y--;
    ans += ask(y) - ask(x);
  }
  for (int i = s; i < t; i++) add(a[i].id, -1);
}
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);
    b[i] = a[i].x;
  }
  sort(b + 1, b + n + 1);
  tot = unique(b + 1, b + n + 1) - b - 1;
  for (int i = 1; i <= n; i++)
    a[i].id = lower_bound(b + 1, b + tot + 1, a[i].x) - b;
  sort(a + 1, a + n + 1, cmp);
  slove(1, n);
  printf("%lld\n", ans);
  return 0;
}
