#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e17;
int n;
vector<int> h, p, c;
struct node {
node* c[2];
int lx, rx;
ll maxv;
ll lazy;
};
int node_idx;
vector<node> node_pool;
void init_pool() {
node_idx = 0;
}
node* alloc_node() {
assert(node_idx < int(node_pool.size()));
return &(node_pool[node_idx++]);
}
node* init(int lx, int rx) {
node* v = alloc_node();
v->c[0] = v->c[1] = NULL;
v->lx = lx; v->rx = rx;
v->lazy = 0;
v->maxv = -INF;
if (lx + 1 < rx) {
v->c[0] = init(lx, (lx + rx) / 2);
v->c[1] = init((lx + rx) / 2, rx);
}
return v;
}
void upd_add(node* v, int ulx, int urx, ll del) {
if (urx <= v->lx || v->rx <= ulx) {
return;
} else if (ulx <= v->lx && v->rx <= urx) {
v->maxv += del;
v->lazy += del;
} else {
upd_add(v->c[0], ulx, urx, del);
upd_add(v->c[1], ulx, urx, del);
v->maxv = max(v->c[0]->maxv, v->c[1]->maxv) + v->lazy;
}
}
void upd_max(node* v, int px, ll x) {
if (v->lx + 1 == v->rx) {
assert(v->lx == px);
v->maxv = max(v->maxv, x);
} else {
x -= v->lazy;
if (px < v->c[0]->rx) upd_max(v->c[0], px, x);
else upd_max(v->c[1], px, x);
v->maxv = max(v->c[0]->maxv, v->c[1]->maxv) + v->lazy;
}
}
ll query(node* v, int ulx, int urx) {
if (urx <= v->lx || v->rx <= ulx) {
return -INF;
} else if (ulx <= v->lx && v->rx <= urx) {
return v->maxv;
} else {
return max(query(v->c[0], ulx, urx), query(v->c[1], ulx, urx)) + v->lazy;
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
h.resize(n), p.resize(n), c.resize(n);
for (int i = 0; i < n; i++) {
cin >> h[i] >> p[i] >> c[i];
}
vector<int> vals = h;
vals.push_back(0);
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
for (int i = 0; i < n; i++) {
h[i] = int(lower_bound(vals.begin(), vals.end(), h[i]) - vals.begin());
}
int m = int(vals.size());
node_pool.resize(2*m-1);
init_pool();
node* segtree = init(0, m);
upd_max(segtree, 0, 0);
vector<ll> incr_best;
for (int i = 0; i < n; i++) {
int cur = h[i];
ll best = query(segtree, 0, cur+1) + p[i];
upd_add(segtree, 0, cur+1, -c[i]);
upd_max(segtree, cur, best);
incr_best.push_back(best);
}
init_pool();
segtree = init(0, m);
upd_max(segtree, 0, 0);
ll finalans = 0;
for (int i = n-1; i >= 0; i--) {
int cur = h[i];
ll best = query(segtree, 0, cur+1);
finalans = max(finalans, best + incr_best[i]);
best += p[i];
upd_add(segtree, 0, cur+1, -c[i]);
upd_max(segtree, cur, best);
}
cout << finalans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKY29uc3QgbGwgSU5GID0gMWUxNzsKCmludCBuOwp2ZWN0b3I8aW50PiBoLCBwLCBjOwoKc3RydWN0IG5vZGUgewoJbm9kZSogY1syXTsKCWludCBseCwgcng7CglsbCBtYXh2OwoJbGwgbGF6eTsKfTsKaW50IG5vZGVfaWR4Owp2ZWN0b3I8bm9kZT4gbm9kZV9wb29sOwoKdm9pZCBpbml0X3Bvb2woKSB7Cglub2RlX2lkeCA9IDA7Cn0KCm5vZGUqIGFsbG9jX25vZGUoKSB7Cglhc3NlcnQobm9kZV9pZHggPCBpbnQobm9kZV9wb29sLnNpemUoKSkpOwoJcmV0dXJuICYobm9kZV9wb29sW25vZGVfaWR4KytdKTsKfQoKbm9kZSogaW5pdChpbnQgbHgsIGludCByeCkgewoJbm9kZSogdiA9IGFsbG9jX25vZGUoKTsKCXYtPmNbMF0gPSB2LT5jWzFdID0gTlVMTDsKCXYtPmx4ID0gbHg7IHYtPnJ4ID0gcng7Cgl2LT5sYXp5ID0gMDsKCXYtPm1heHYgPSAtSU5GOwoJaWYgKGx4ICsgMSA8IHJ4KSB7CgkJdi0+Y1swXSA9IGluaXQobHgsIChseCArIHJ4KSAvIDIpOwoJCXYtPmNbMV0gPSBpbml0KChseCArIHJ4KSAvIDIsIHJ4KTsKCX0KCXJldHVybiB2Owp9Cgp2b2lkIHVwZF9hZGQobm9kZSogdiwgaW50IHVseCwgaW50IHVyeCwgbGwgZGVsKSB7CglpZiAodXJ4IDw9IHYtPmx4IHx8IHYtPnJ4IDw9IHVseCkgewoJCXJldHVybjsKCX0gZWxzZSBpZiAodWx4IDw9IHYtPmx4ICYmIHYtPnJ4IDw9IHVyeCkgewoJCXYtPm1heHYgKz0gZGVsOwoJCXYtPmxhenkgKz0gZGVsOwoJfSBlbHNlIHsKCQl1cGRfYWRkKHYtPmNbMF0sIHVseCwgdXJ4LCBkZWwpOwoJCXVwZF9hZGQodi0+Y1sxXSwgdWx4LCB1cngsIGRlbCk7CgkJdi0+bWF4diA9IG1heCh2LT5jWzBdLT5tYXh2LCB2LT5jWzFdLT5tYXh2KSArIHYtPmxhenk7Cgl9Cn0KCnZvaWQgdXBkX21heChub2RlKiB2LCBpbnQgcHgsIGxsIHgpIHsKCWlmICh2LT5seCArIDEgPT0gdi0+cngpIHsKCQlhc3NlcnQodi0+bHggPT0gcHgpOwoJCXYtPm1heHYgPSBtYXgodi0+bWF4diwgeCk7Cgl9IGVsc2UgewoJCXggLT0gdi0+bGF6eTsKCQlpZiAocHggPCB2LT5jWzBdLT5yeCkgdXBkX21heCh2LT5jWzBdLCBweCwgeCk7CgkJZWxzZSB1cGRfbWF4KHYtPmNbMV0sIHB4LCB4KTsKCQl2LT5tYXh2ID0gbWF4KHYtPmNbMF0tPm1heHYsIHYtPmNbMV0tPm1heHYpICsgdi0+bGF6eTsKCX0KfQoKbGwgcXVlcnkobm9kZSogdiwgaW50IHVseCwgaW50IHVyeCkgewoJaWYgKHVyeCA8PSB2LT5seCB8fCB2LT5yeCA8PSB1bHgpIHsKCQlyZXR1cm4gLUlORjsKCX0gZWxzZSBpZiAodWx4IDw9IHYtPmx4ICYmIHYtPnJ4IDw9IHVyeCkgewoJCXJldHVybiB2LT5tYXh2OwoJfSBlbHNlIHsKCQlyZXR1cm4gbWF4KHF1ZXJ5KHYtPmNbMF0sIHVseCwgdXJ4KSwgcXVlcnkodi0+Y1sxXSwgdWx4LCB1cngpKSArIHYtPmxhenk7Cgl9Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCksIGNpbi50aWUoMCk7CgljaW4gPj4gbjsKCWgucmVzaXplKG4pLCBwLnJlc2l6ZShuKSwgYy5yZXNpemUobik7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCWNpbiA+PiBoW2ldID4+IHBbaV0gPj4gY1tpXTsKCX0KCXZlY3RvcjxpbnQ+IHZhbHMgPSBoOwoJdmFscy5wdXNoX2JhY2soMCk7Cglzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7Cgl2YWxzLmVyYXNlKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpLCB2YWxzLmVuZCgpKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJaFtpXSA9IGludChsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIGhbaV0pIC0gdmFscy5iZWdpbigpKTsKCX0KCWludCBtID0gaW50KHZhbHMuc2l6ZSgpKTsKCglub2RlX3Bvb2wucmVzaXplKDIqbS0xKTsKCWluaXRfcG9vbCgpOwoJbm9kZSogc2VndHJlZSA9IGluaXQoMCwgbSk7Cgl1cGRfbWF4KHNlZ3RyZWUsIDAsIDApOwoJdmVjdG9yPGxsPiBpbmNyX2Jlc3Q7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCWludCBjdXIgPSBoW2ldOwoJCWxsIGJlc3QgPSBxdWVyeShzZWd0cmVlLCAwLCBjdXIrMSkgKyBwW2ldOwoJCXVwZF9hZGQoc2VndHJlZSwgMCwgY3VyKzEsIC1jW2ldKTsKCQl1cGRfbWF4KHNlZ3RyZWUsIGN1ciwgYmVzdCk7CgkJaW5jcl9iZXN0LnB1c2hfYmFjayhiZXN0KTsKCX0KCWluaXRfcG9vbCgpOwoJc2VndHJlZSA9IGluaXQoMCwgbSk7Cgl1cGRfbWF4KHNlZ3RyZWUsIDAsIDApOwoJbGwgZmluYWxhbnMgPSAwOwoJZm9yIChpbnQgaSA9IG4tMTsgaSA+PSAwOyBpLS0pIHsKCQlpbnQgY3VyID0gaFtpXTsKCQlsbCBiZXN0ID0gcXVlcnkoc2VndHJlZSwgMCwgY3VyKzEpOwoJCWZpbmFsYW5zID0gbWF4KGZpbmFsYW5zLCBiZXN0ICsgaW5jcl9iZXN0W2ldKTsKCQliZXN0ICs9IHBbaV07CgkJdXBkX2FkZChzZWd0cmVlLCAwLCBjdXIrMSwgLWNbaV0pOwoJCXVwZF9tYXgoc2VndHJlZSwgY3VyLCBiZXN0KTsKCX0KCWNvdXQgPDwgZmluYWxhbnMgPDwgJ1xuJzsKfQo=