#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, r, iq, L, R;
};
struct node p[100010], tmp[100010];
int n, tot, K, x[100010 << 2], q[100010];
long long ans = 0;
struct BinaryIndexedTree {
  int c[100010 << 2];
  inline void update(int x, int k) {
    x = min(x, tot);
    for (; x <= tot; x += x & -x) c[x] += k;
  }
  inline int getsum(int x) {
    int ans = 0;
    for (; x > 0; x -= x & -x) ans += c[x];
    return ans;
  }
} BIT;
bool cmp1(node a, node b) { return a.r > b.r; }
bool cmp2(node a, node b) { return a.iq > b.iq; }
void cdq(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  cdq(l, mid);
  cdq(mid + 1, r);
  int h = 0, t = 0;
  for (int i = mid + 1, j = l; i <= r; i++) {
    while (j <= mid && p[j].iq - p[i].iq > K) j++;
    while (j <= mid && abs(p[j].iq - p[i].iq) <= K) {
      BIT.update(p[j].x, 1);
      q[t++] = j++;
    }
    while (h < t && abs(p[q[h]].iq - p[i].iq) > K) {
      BIT.update(p[q[h]].x, -1);
      h++;
    }
    ans += BIT.getsum(p[i].R) - BIT.getsum(p[i].L - 1);
  }
  for (; h < t; h++) BIT.update(p[q[h]].x, -1);
  inplace_merge(p + l, p + mid + 1, p + r + 1, cmp2);
}
int main() {
  scanf("%d%d", &n, &K);
  for (int i = 1; i <= n; i++) {
    int X, Y, Z;
    scanf("%d%d%d", &X, &Y, &Z);
    struct node a;
    a.x = X;
    a.r = Y;
    a.iq = Z;
    p[i] = a;
    x[++tot] = X;
    x[++tot] = X - Y;
    x[++tot] = X + Y;
  }
  sort(x + 1, x + tot + 1);
  tot = unique(x + 1, x + tot + 1) - x - 1;
  for (int i = 1; i <= n; i++) {
    p[i].L = lower_bound(x + 1, x + tot + 1, p[i].x - p[i].r) - x;
    p[i].R = lower_bound(x + 1, x + tot + 1, p[i].x + p[i].r) - x;
    p[i].x = lower_bound(x + 1, x + tot + 1, p[i].x) - x;
  }
  sort(p + 1, p + n + 1, cmp1);
  cdq(1, n);
  printf("%lld\n", ans);
  return 0;
}
