#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n;
long long K;
int c[3 * N];
int lim = 3 * N;
int cc;
long long dis[3 * N];
long long ans;
struct node {
  long long x, y;
  long long L, R, r;
} a[N];
int lowbit(int x) { return x & (-x); }
void update(int x, long long val) {
  for (; x < lim; x += lowbit(x)) {
    c[x] += val;
  }
}
long long query(int x) {
  long long sum = 0;
  for (; x > 0; x -= lowbit(x)) {
    sum += c[x];
  }
  return sum;
}
void clearr(int x) {
  for (; x < lim; x += lowbit(x)) {
    if (c[x] == 0) break;
    c[x] = 0;
  }
}
bool cmp2(node a, node b) { return a.y < b.y; }
void cdq(int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1;
  cdq(l, mid), cdq(mid + 1, r);
  int p1, p2;
  p1 = p2 = mid + 1;
  for (int i = l; i <= mid; i++) {
    while (p2 <= r && a[p2].y <= a[i].y + K) {
      update(a[p2].x, 1);
      p2++;
    }
    while (p1 < p2 && a[p1].y < a[i].y - K) {
      update(a[p1].x, -1);
      p1++;
    }
    ans += query(a[i].R) - query(a[i].L - 1);
  }
  for (int i = p1; i < p2; i++) clearr(a[i].x);
  inplace_merge(a + l, a + mid + 1, a + r + 1, cmp2);
}
bool cmp1(node a, node b) { return a.r < b.r; }
int main() {
  scanf("%d %lld", &n, &K);
  cc = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%lld %lld %lld", &a[i].x, &a[i].r, &a[i].y);
    dis[++cc] = a[i].x;
    dis[++cc] = a[i].x - a[i].r;
    dis[++cc] = a[i].x + a[i].r;
  }
  sort(dis + 1, dis + cc + 1);
  cc = unique(dis + 1, dis + cc + 1) - (dis + 1);
  for (int i = 1; i <= n; i++) {
    int in = lower_bound(dis + 1, dis + cc + 1, a[i].x - a[i].r) - dis;
    a[i].L = in;
    in = lower_bound(dis + 1, dis + cc + 1, a[i].x + a[i].r) - dis;
    a[i].R = in;
    in = lower_bound(dis + 1, dis + cc + 1, a[i].x) - dis;
    a[i].x = in;
  }
  sort(a + 1, a + n + 1, cmp1);
  cdq(1, n);
  printf("%lld\n", ans);
  return 0;
}
