#include <bits/stdc++.h>
#pragma GCC optimize(3, "Ofast", "inline")
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
const long long maxn = (long long)1e5 + 5;
const long long mod = 1e9 + 7;
const long long inf = 0x3f3f3f3f;
long long T = 1;
long long n, K;
struct node {
  long long p, q, l, r, len;
} a[maxn];
bool cmp(const node &x, const node &b) { return x.len > b.len; }
long long ans = 0;
long long c[maxn];
void add(long long x, long long val) {
  while (x <= n) c[x] += val, x += (x & (-x));
}
long long query(long long x) {
  long long ret = 0;
  while (x) ret += c[x], x -= (x & (-x));
  return ret;
}
long long query(long long l, long long r) { return query(r) - query(l - 1); }
bool cmp2(const node &x, const node &y) { return x.q < y.q; }
void fun(long long l, long long r) {
  if (l == r) return;
  long long mid = (l + r) >> 1;
  fun(l, mid);
  fun(mid + 1, r);
  long long L = l, R = l - 1;
  for (long long i = mid + 1; i <= r; ++i) {
    while (L <= mid && a[i].q - a[L].q > K) add(a[L].p, -1), ++L;
    while (R < mid && a[R + 1].q - a[i].q <= K) ++R, add(a[R].p, 1);
    ans += query(a[i].l, a[i].r);
  }
  for (long long i = L; i <= R; ++i) add(a[i].p, -1);
  sort(a + l, a + r + 1, cmp2);
}
long long b[maxn];
void solve() {
  cin >> n >> K;
  for (long long i = 1; i <= n; ++i) {
    cin >> a[i].p >> a[i].len >> a[i].q;
    b[i] = a[i].p;
  }
  sort(b + 1, b + n + 1);
  long long tot = unique(b + 1, b + n + 1) - b - 1;
  for (long long i = 1; i <= n; ++i) {
    a[i].l = lower_bound(b + 1, b + tot + 1, a[i].p - a[i].len) - b;
    a[i].r = upper_bound(b + 1, b + tot + 1, a[i].p + a[i].len) - b - 1;
    a[i].p = lower_bound(b + 1, b + tot + 1, a[i].p) - b;
  }
  sort(a + 1, a + n + 1, cmp);
  fun(1, n);
  cout << ans;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  while (T--) solve();
  return 0;
}
