#include <cstdio>
#include <algorithm>
using namespace std;
const int N_MAX = 100000;
const int AI_SIZE = 262144;
const int INF = 0x3f3f3f3f;
struct stalp { int x,c,s,d; };
int n;
stalp v[N_MAX], w[N_MAX];
int d[N_MAX];
int ai[AI_SIZE];
bool comp_1 ( const stalp &a, const stalp &b ) { return a.x < b.x; }
bool comp_2 ( const stalp &a, const stalp &b ) { return a.x + a.d < b.x + b.d; }
bool search_comp ( const stalp &a, const stalp &b ) { return a.x < b.x; }
int query ( int ql, int qr, int nod = 1, int left = 0, int right = n-1 ) {
if (ql <= left && right <= qr)
return ai[nod];
int mid = left + (right-left)/2, q1 = INF, q2 = INF;
if (ql <= mid) q1 = query(ql, qr, nod << 1, left, mid);
if (qr > mid) q2 = query(ql, qr, (nod << 1)+1, mid+1, right);
return min(q1,q2);
}
void update ( int x, int v, int nod = 1, int left = 0, int right = n-1 ) {
if (left == right) {
ai[nod] = v;
} else {
int mid = left + (right-left)/2;
if (x <= mid)
update(x, v, nod << 1, left, mid); else
update(x, v, (nod << 1)+1, mid+1, right);
ai[nod] = min(ai[nod << 1], ai[(nod << 1)+1]);
}
}
int main() {
freopen("stalpi.in","rt",stdin);
freopen("stalpi.out","wt",stdout);
scanf("%d",&n);
for (int i = 0; i <n; ++i)
scanf("%d %d %d %d",&v[i].x,&v[i].c,&v[i].s,&v[i].d);
copy(v,v+n,w);
sort(v,v+n,comp_1);
sort(w,w+n,comp_2);
fill(ai,ai+AI_SIZE,INF);
fill(d,d+n,INF);
for (int i = 0; i < n; ++i) {
stalp what;
what.x = w[i].x - w[i].s;
int left = lower_bound(v, v+n, what, search_comp) - v;
what.x = w[i].x + w[i].d;
int right = upper_bound(v, v+n, what, search_comp) - v - 1;
int min = left == 0 ? 0 : query(left,n-1);
if (left > 0 && d[left-1] < min) min = d[left-1];
if (min + w[i].c < d[right]) {
d[right] = min + w[i].c;
update(right,d[right]);
}
}
printf("%d\n",d[n-1]);
return 0;
}