#include <bits/stdc++.h>
using namespace std;
bool memory1;
typedef int ll;
typedef unsigned long long ull;
typedef double dbe;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
#define openFile(name) freopen((name ".inp"), "r", stdin), freopen((name ".out"), "w", stdout)
#define FOR(i, a, b, x) for (ll i = (a); i <= (b); i += (x))
#define ROF(i, a, b, x) for (ll i = (a); i >= (b); i += (x))
#define fi first
#define se second
#define MASK(x) (1LL << (x))
#define getBit(mask, i) (((mask) >> (i)) & 1)
#define BitOn(mask) (__builtin_popcountll(mask))
const int maxN = 1e5 + 2;
const ll LOG = 22;
const ll INF18 = 1e18;
const int INF9 = 1e9;
const ll MOD = 1e9 + 7;
struct pii {
ll x, r, q;
pii(ll xx = 0, ll rr = 0, ll qq = 0) : x(xx), r(rr), q(qq) {}
};
// BIT-of-BIT for 2D queries
struct BIT {
ll n;
vector<vector<ll>> b;
vector<vector<int>> fenw;
BIT(ll _): n(_), b(n+1) {}
// collect all q-values for each index
void fakeUpdate(ll i, ll q) {
for (; i <= n; i += i & -i)
b[i].push_back(q);
}
// build inner BITs
void init() {
fenw.assign(n+1, {});
for (ll i = 1; i <= n; i++) {
auto &v = b[i];
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
fenw[i].assign(v.size() + 1, 0);
}
}
// point update
void update(ll i, ll q) {
for (; i <= n; i += i & -i) {
auto &v = b[i];
ll pos = lower_bound(v.begin(), v.end(), q) - v.begin() + 1;
for (ll j = pos; j < (ll)fenw[i].size(); j += j & -j)
fenw[i][j]++;
}
}
// range count of q in [l..r] up to index i
ll query(ll i, ll l, ll r) {
ll res = 0;
for (; i > 0; i -= i & -i) {
auto &v = b[i];
ll L = lower_bound(v.begin(), v.end(), l) - v.begin() + 1;
ll R = upper_bound(v.begin(), v.end(), r) - v.begin();
for (ll j = R; j > 0; j -= j & -j) res += fenw[i][j];
for (ll j = L - 1; j > 0; j -= j & -j) res -= fenw[i][j];
}
return res;
}
};
ll n, K;
pii a[maxN];
vll valX, valQ;
bool cmpR(const pii &A, const pii &B) {
return A.r > B.r;
}
ll getIDlow(const vll &vt, ll val) {
return lower_bound(vt.begin(), vt.end(), val) - vt.begin() + 1;
}
ll getIDup(const vll &vt, ll val) {
return upper_bound(vt.begin(), vt.end(), val) - vt.begin();
}
ll Solve() {
// collect coordinates
FOR(i, 1, n, 1) {
valX.push_back(a[i].x);
valX.push_back(a[i].x - a[i].r);
valX.push_back(a[i].x + a[i].r);
valQ.push_back(a[i].q);
valQ.push_back(a[i].q - K);
valQ.push_back(a[i].q + K);
}
sort(valX.begin(), valX.end());
valX.erase(unique(valX.begin(), valX.end()), valX.end());
sort(valQ.begin(), valQ.end());
valQ.erase(unique(valQ.begin(), valQ.end()), valQ.end());
ll sizX = valX.size();
BIT bit(sizX);
// preprocess fake updates
FOR(i, 1, n, 1) {
ll xi = getIDlow(valX, a[i].x);
ll qi = getIDlow(valQ, a[i].q);
bit.fakeUpdate(xi, qi);
}
bit.init();
ll ans = 0;
sort(a + 1, a + n + 1, cmpR);
FOR(i, 1, n, 1) {
ll xi = getIDlow(valX, a[i].x);
ll L = getIDlow(valX, a[i].x - a[i].r);
ll R = getIDup(valX, a[i].x + a[i].r);
ll qi = getIDlow(valQ, a[i].q);
ll lq = getIDlow(valQ, a[i].q - K);
ll rq = getIDup(valQ, a[i].q + K);
if (L <= R)
ans += bit.query(R, lq, rq) - bit.query(L - 1, lq, rq);
bit.update(xi, qi);
}
return ans;
}
void input() {
cin >> n >> K;
FOR(i, 1, n, 1) cin >> a[i].x >> a[i].r >> a[i].q;
cout << Solve();
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmJvb2wgbWVtb3J5MTsKCnR5cGVkZWYgaW50IGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgZG91YmxlIGRiZTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmxsOwoKI2RlZmluZSBvcGVuRmlsZShuYW1lKSBmcmVvcGVuKChuYW1lICIuaW5wIiksICJyIiwgc3RkaW4pLCBmcmVvcGVuKChuYW1lICIub3V0IiksICJ3Iiwgc3Rkb3V0KQojZGVmaW5lIEZPUihpLCBhLCBiLCB4KSBmb3IgKGxsIGkgPSAoYSk7IGkgPD0gKGIpOyBpICs9ICh4KSkKI2RlZmluZSBST0YoaSwgYSwgYiwgeCkgZm9yIChsbCBpID0gKGEpOyBpID49IChiKTsgaSArPSAoeCkpCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBNQVNLKHgpICgxTEwgPDwgKHgpKQojZGVmaW5lIGdldEJpdChtYXNrLCBpKSAoKChtYXNrKSA+PiAoaSkpICYgMSkKI2RlZmluZSBCaXRPbihtYXNrKSAoX19idWlsdGluX3BvcGNvdW50bGwobWFzaykpCgpjb25zdCBpbnQgbWF4TiA9IDFlNSArIDI7CmNvbnN0IGxsIExPRyA9IDIyOwpjb25zdCBsbCBJTkYxOCA9IDFlMTg7CmNvbnN0IGludCBJTkY5ID0gMWU5Owpjb25zdCBsbCBNT0QgPSAxZTkgKyA3OwoKc3RydWN0IHBpaSB7CiAgICBsbCB4LCByLCBxOwogICAgcGlpKGxsIHh4ID0gMCwgbGwgcnIgPSAwLCBsbCBxcSA9IDApIDogeCh4eCksIHIocnIpLCBxKHFxKSB7fQp9OwoKLy8gQklULW9mLUJJVCBmb3IgMkQgcXVlcmllcwpzdHJ1Y3QgQklUIHsKICAgIGxsIG47CiAgICB2ZWN0b3I8dmVjdG9yPGxsPj4gYjsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZmVudzsKICAgIEJJVChsbCBfKTogbihfKSwgYihuKzEpIHt9CgogICAgLy8gY29sbGVjdCBhbGwgcS12YWx1ZXMgZm9yIGVhY2ggaW5kZXgKICAgIHZvaWQgZmFrZVVwZGF0ZShsbCBpLCBsbCBxKSB7CiAgICAgICAgZm9yICg7IGkgPD0gbjsgaSArPSBpICYgLWkpCiAgICAgICAgICAgIGJbaV0ucHVzaF9iYWNrKHEpOwogICAgfQoKICAgIC8vIGJ1aWxkIGlubmVyIEJJVHMKICAgIHZvaWQgaW5pdCgpIHsKICAgICAgICBmZW53LmFzc2lnbihuKzEsIHt9KTsKICAgICAgICBmb3IgKGxsIGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBhdXRvICZ2ID0gYltpXTsKICAgICAgICAgICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgICAgICAgICB2LmVyYXNlKHVuaXF1ZSh2LmJlZ2luKCksIHYuZW5kKCkpLCB2LmVuZCgpKTsKICAgICAgICAgICAgZmVud1tpXS5hc3NpZ24odi5zaXplKCkgKyAxLCAwKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gcG9pbnQgdXBkYXRlCiAgICB2b2lkIHVwZGF0ZShsbCBpLCBsbCBxKSB7CiAgICAgICAgZm9yICg7IGkgPD0gbjsgaSArPSBpICYgLWkpIHsKICAgICAgICAgICAgYXV0byAmdiA9IGJbaV07CiAgICAgICAgICAgIGxsIHBvcyA9IGxvd2VyX2JvdW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgcSkgLSB2LmJlZ2luKCkgKyAxOwogICAgICAgICAgICBmb3IgKGxsIGogPSBwb3M7IGogPCAobGwpZmVud1tpXS5zaXplKCk7IGogKz0gaiAmIC1qKQogICAgICAgICAgICAgICAgZmVud1tpXVtqXSsrOwogICAgICAgIH0KICAgIH0KCiAgICAvLyByYW5nZSBjb3VudCBvZiBxIGluIFtsLi5yXSB1cCB0byBpbmRleCBpCiAgICBsbCBxdWVyeShsbCBpLCBsbCBsLCBsbCByKSB7CiAgICAgICAgbGwgcmVzID0gMDsKICAgICAgICBmb3IgKDsgaSA+IDA7IGkgLT0gaSAmIC1pKSB7CiAgICAgICAgICAgIGF1dG8gJnYgPSBiW2ldOwogICAgICAgICAgICBsbCBMID0gbG93ZXJfYm91bmQodi5iZWdpbigpLCB2LmVuZCgpLCBsKSAtIHYuYmVnaW4oKSArIDE7CiAgICAgICAgICAgIGxsIFIgPSB1cHBlcl9ib3VuZCh2LmJlZ2luKCksIHYuZW5kKCksIHIpIC0gdi5iZWdpbigpOwogICAgICAgICAgICBmb3IgKGxsIGogPSBSOyBqID4gMDsgaiAtPSBqICYgLWopIHJlcyArPSBmZW53W2ldW2pdOwogICAgICAgICAgICBmb3IgKGxsIGogPSBMIC0gMTsgaiA+IDA7IGogLT0gaiAmIC1qKSByZXMgLT0gZmVud1tpXVtqXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfTsKCmxsIG4sIEs7CnBpaSBhW21heE5dOwp2bGwgdmFsWCwgdmFsUTsKCmJvb2wgY21wUihjb25zdCBwaWkgJkEsIGNvbnN0IHBpaSAmQikgewogICAgcmV0dXJuIEEuciA+IEIucjsKfQoKbGwgZ2V0SURsb3coY29uc3QgdmxsICZ2dCwgbGwgdmFsKSB7CiAgICByZXR1cm4gbG93ZXJfYm91bmQodnQuYmVnaW4oKSwgdnQuZW5kKCksIHZhbCkgLSB2dC5iZWdpbigpICsgMTsKfQpsbCBnZXRJRHVwKGNvbnN0IHZsbCAmdnQsIGxsIHZhbCkgewogICAgcmV0dXJuIHVwcGVyX2JvdW5kKHZ0LmJlZ2luKCksIHZ0LmVuZCgpLCB2YWwpIC0gdnQuYmVnaW4oKTsKfQoKbGwgU29sdmUoKSB7CiAgICAvLyBjb2xsZWN0IGNvb3JkaW5hdGVzCiAgICBGT1IoaSwgMSwgbiwgMSkgewogICAgICAgIHZhbFgucHVzaF9iYWNrKGFbaV0ueCk7CiAgICAgICAgdmFsWC5wdXNoX2JhY2soYVtpXS54IC0gYVtpXS5yKTsKICAgICAgICB2YWxYLnB1c2hfYmFjayhhW2ldLnggKyBhW2ldLnIpOwogICAgICAgIHZhbFEucHVzaF9iYWNrKGFbaV0ucSk7CiAgICAgICAgdmFsUS5wdXNoX2JhY2soYVtpXS5xIC0gSyk7CiAgICAgICAgdmFsUS5wdXNoX2JhY2soYVtpXS5xICsgSyk7CiAgICB9CiAgICBzb3J0KHZhbFguYmVnaW4oKSwgdmFsWC5lbmQoKSk7CiAgICB2YWxYLmVyYXNlKHVuaXF1ZSh2YWxYLmJlZ2luKCksIHZhbFguZW5kKCkpLCB2YWxYLmVuZCgpKTsKICAgIHNvcnQodmFsUS5iZWdpbigpLCB2YWxRLmVuZCgpKTsKICAgIHZhbFEuZXJhc2UodW5pcXVlKHZhbFEuYmVnaW4oKSwgdmFsUS5lbmQoKSksIHZhbFEuZW5kKCkpOwoKICAgIGxsIHNpelggPSB2YWxYLnNpemUoKTsKICAgIEJJVCBiaXQoc2l6WCk7CgogICAgLy8gcHJlcHJvY2VzcyBmYWtlIHVwZGF0ZXMKICAgIEZPUihpLCAxLCBuLCAxKSB7CiAgICAgICAgbGwgeGkgPSBnZXRJRGxvdyh2YWxYLCBhW2ldLngpOwogICAgICAgIGxsIHFpID0gZ2V0SURsb3codmFsUSwgYVtpXS5xKTsKICAgICAgICBiaXQuZmFrZVVwZGF0ZSh4aSwgcWkpOwogICAgfQogICAgYml0LmluaXQoKTsKCiAgICBsbCBhbnMgPSAwOwogICAgc29ydChhICsgMSwgYSArIG4gKyAxLCBjbXBSKTsKCiAgICBGT1IoaSwgMSwgbiwgMSkgewogICAgICAgIGxsIHhpID0gZ2V0SURsb3codmFsWCwgYVtpXS54KTsKICAgICAgICBsbCBMID0gZ2V0SURsb3codmFsWCwgYVtpXS54IC0gYVtpXS5yKTsKICAgICAgICBsbCBSID0gZ2V0SUR1cCh2YWxYLCBhW2ldLnggKyBhW2ldLnIpOwogICAgICAgIGxsIHFpID0gZ2V0SURsb3codmFsUSwgYVtpXS5xKTsKICAgICAgICBsbCBscSA9IGdldElEbG93KHZhbFEsIGFbaV0ucSAtIEspOwogICAgICAgIGxsIHJxID0gZ2V0SUR1cCh2YWxRLCBhW2ldLnEgKyBLKTsKICAgICAgICBpZiAoTCA8PSBSKQogICAgICAgICAgICBhbnMgKz0gYml0LnF1ZXJ5KFIsIGxxLCBycSkgLSBiaXQucXVlcnkoTCAtIDEsIGxxLCBycSk7CiAgICAgICAgYml0LnVwZGF0ZSh4aSwgcWkpOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKdm9pZCBpbnB1dCgpIHsKICAgIGNpbiA+PiBuID4+IEs7CiAgICBGT1IoaSwgMSwgbiwgMSkgY2luID4+IGFbaV0ueCA+PiBhW2ldLnIgPj4gYVtpXS5xOwogICAgY291dCA8PCBTb2x2ZSgpOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgaW5wdXQoKTsKICAgIHJldHVybiAwOwp9Cg==