#include <cstdio>
#include <algorithm>
using namespace std;
const long long INF = 100000000000000;
const int NMAX = 100005;
struct ABC {
int x;
long long c;
int st, dr;
};
ABC v[NMAX];
bool cmp(ABC first, ABC second) {
return (first.x < second.x);
}
long long best[NMAX];
long long aint[4 * NMAX];
void update(int nod, int st, int dr, int poz, long long val) {
if(st == dr) {
if(val == -1) {
aint[nod] = INF;
}
else {
aint[nod] = min(aint[nod], val);
}
return ;
}
int mij = (st + dr) / 2;
if(poz <= mij) {
update(2 * nod, st, mij, poz, val);
}
else {
update(2 * nod + 1, mij + 1, dr, poz, val);
}
aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
}
long long query(int nod, int st, int dr, int x, int y) {
if(dr < x) {
return INF;
}
if(y < st) {
return INF;
}
if(x <= st && dr <= y) {
return aint[nod];
}
int mij = (st + dr) / 2;
long long s1 = query(2 * nod, st, mij, x, y);
long long s2 = query(2 * nod + 1, mij + 1, dr, x, y);
return min(s1, s2);
}
int cb(int i, int n, bool ok) {
int st = 1, dr = n, last = i;
while(st <= dr) {
int mij = (st + dr) / 2;
if(ok == 0) {
if(v[mij].x >= v[i].x - v[i].st) {
dr = mij - 1;
last = mij;
}
else {
st = mij + 1;
}
}
else {
if(v[mij].x <= v[i].x + v[i].dr) {
st = mij + 1;
last = mij;
}
else {
dr = mij - 1;
}
}
}
return last;
}
int main() {
int n;
freopen("stalpi.in", "r", stdin);
freopen("stalpi.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d%lld%d%d", &v[i].x, &v[i].c, &v[i].st, &v[i].dr);
update(1, 1, n, i, -1);
}
sort(v + 1, v + n + 1, cmp);
for(int i = 1; i <= n; i++) {
int p1 = cb(i, n, 0);
int p2 = cb(i, n, 1);
if(p1 == 1) {
update(1, 1, n, p2, v[i].c);
}
else {
long long nr = query(1, 1, n, p1 - 1, p2);
update(1, 1, n, p2, v[i].c + nr);
}
}
printf("%lld\n", query(1, 1, n, n, n));
return 0;
}