#include using namespace std; typedef long long int ll; typedef unsigned long long int ull; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll myRand(ll B) { return (ull)rng() % B; } template struct segtree { int n; vector tree; segtree() : segtree(0) {} segtree(int n) : n(n), tree(vector(n << 1, e())) {} segtree(const vector &v) : n((int)v.size()) { tree.resize(n * 2); for (int i = 0; i < n; ++i) { tree[n + i] = v[i]; } for (int i = n - 1; i >= 1; --i) { update(i); } } void update(int k) { tree[k] = op(tree[k << 1 | 0], tree[k << 1 | 1]); } S operator[](int i) { return tree[i + n]; } void set(int i, S x) { i += n; tree[i] = x; while (i >>= 1) { update(i); } } // [l,r) S query(int l, int r) { S sml = e(), smr = e(); for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) sml = op(sml, tree[l++]); if (r & 1) smr = op(tree[--r], smr); } return op(sml, smr); } }; using S = ll; S op(S a, S b) { return max(a, b); } S e() { return -(1LL << 60); } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; vector t(n), x(n), va(n); for (int i = 0; i < n; ++i) { cin >> t[i] >> x[i] >> va[i]; } t.push_back(0); x.push_back(0); va.push_back(0); n += 1; vector> v(n); vector vv = {0}; for (int i = 0; i < n; ++i) { vv.push_back(t[i] - x[i]); } sort(vv.begin(), vv.end()); vv.erase(unique(vv.begin(), vv.end()), vv.end()); for (int i = 0; i < n; ++i) { int idx = lower_bound(vv.begin(), vv.end(), t[i] - x[i]) - vv.begin(); v[i] = {t[i] + x[i], idx, va[i]}; } sort(v.begin(), v.end()); int m = vv.size(); segtree seg(m); bool f = false; for (int i = 0; i < n; ++i) { auto [_, a, b] = v[i]; if (_ == 0 && vv[a] == 0 && b == 0) { seg.set(a, 0); f = true; continue; } if (!f) continue; ll best = seg.query(0, a + 1); // 到達不能 if (best == e()) continue; b += best; seg.set(a, max(seg[a], b)); } cout << max(seg.query(0, m), 0LL) << endl; }