#include <bits/stdc++.h>
using namespace std;
map<long long, long long> mp;
const long long W = 1000000005;
long long n, k, cnt, ans;
long long x[100005], r[100005], q[100005], id[100005];
struct node {
  long long zhi, son[2];
} tt[3000005];
bool cmp(long long aa, long long bb) { return r[aa] > r[bb]; }
long long query(long long rt, long long ll, long long rr, long long L,
                long long R) {
  if (!rt) return 0;
  if (ll == L && rr == R) return tt[rt].zhi;
  long long mid = (ll + rr) >> 1;
  if (R <= mid)
    return query(tt[rt].son[0], ll, mid, L, R);
  else if (L > mid)
    return query(tt[rt].son[1], mid + 1, rr, L, R);
  else
    return query(tt[rt].son[0], ll, mid, L, mid) +
           query(tt[rt].son[1], mid + 1, rr, mid + 1, R);
}
void update(long long &rt, long long ll, long long rr, long long kk) {
  if (!rt) rt = ++cnt;
  tt[rt].zhi++;
  if (ll == rr) return;
  long long mid = (ll + rr) >> 1;
  if (kk <= mid)
    update(tt[rt].son[0], ll, mid, kk);
  else
    update(tt[rt].son[1], mid + 1, rr, kk);
  return;
}
int main() {
  scanf("%lld%lld", &n, &k);
  for (long long i = 1; i <= n; ++i) {
    scanf("%lld%lld%lld", &x[i], &r[i], &q[i]);
    id[i] = i;
  }
  sort(id + 1, id + n + 1, cmp);
  for (long long i = 1; i <= n; ++i) {
    long long now = id[i];
    for (long long j = q[now] - k; j <= q[now] + k; ++j) {
      if (!mp[j]) continue;
      ans += query(mp[j], 0, W, max(0ll, x[now] - r[now]),
                   min(W, x[now] + r[now]));
    }
    update(mp[q[now]], 0, W, x[now]);
  }
  printf("%lld", ans);
  return 0;
}
