#include <bits/stdc++.h>
using namespace std;
int n, k, tot, a[20000000], Ls[20000000], Rs[20000000];
long long ans;
map<int, int> s;
struct pr {
  int x, y, z;
} c[100010];
bool cmp(pr x, pr y) { return x.y > y.y; }
void f2(int x, int y, int L, int R) {
  a[x]++;
  if ((y == L) && (y == R)) return;
  int rr = (L + R) / 2;
  if (y <= rr) {
    if (!Ls[x]) Ls[x] = ++tot;
    f2(Ls[x], y, L, rr);
  } else {
    if (!Rs[x]) Rs[x] = ++tot;
    f2(Rs[x], y, rr + 1, R);
  }
}
void f1(int y, int z) {
  if (!s.count(y)) s[y] = ++tot;
  f2(s[y], z, 0, 1000000000);
}
int q2(int x, int l, int r, int L, int R) {
  if ((l == L) && (r == R)) return a[x];
  int rr = (L + R) / 2;
  if (r <= rr) {
    if (Ls[x])
      return q2(Ls[x], l, r, L, rr);
    else
      return 0;
  } else if (l > rr) {
    if (Rs[x])
      return q2(Rs[x], l, r, rr + 1, R);
    else
      return 0;
  } else {
    int x1 = 0, x2 = 0;
    if (Ls[x]) x1 = q2(Ls[x], l, rr, L, rr);
    if (Rs[x]) x2 = q2(Rs[x], rr + 1, r, rr + 1, R);
    return x1 + x2;
  }
}
int q1(int l, int r, int l1, int r1) {
  int x = 0;
  for (int i = (l); i <= (r); i++)
    if (s.count(i)) x += q2(s[i], l1, r1, 0, 1000000000);
  return x;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = (1); i <= (n); i++) scanf("%d%d%d", &c[i].x, &c[i].y, &c[i].z);
  sort(c + 1, c + n + 1, cmp);
  for (int i = (1); i <= (n); i++) {
    ans += q1(max(c[i].z - k, 0), min(c[i].z + k, 1000000000),
              max(c[i].x - c[i].y, 0), min(c[i].x + c[i].y, 1000000000));
    f1(c[i].z, c[i].x);
  }
  printf("%I64d", ans);
}
