#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define N_max 100001
int N, S[N_max], best[N_max];
int Arb[4*N_max+66], Val, Pos, start, finish, minim;
struct Stalpi
{
int x, c, st, dr;
} P[N_max];
int cmp(Stalpi a, Stalpi b)
{
if(a.dr!=b.dr) return a.dr<b.dr;
}
void Update(int nod, int left, int right)
{
if(left==right)
{
Arb[nod]=Val;
return;
}
int mij=(left+right)/2;
if(Pos<=mij) Update(2*nod, left, mij);
else Update(2*nod+1, mij+1, right);
Arb[nod]=min(Arb[2*nod], Arb[2*nod+1]);
}
void Query(int nod, int left, int right)
{
if(start<=left && right<=finish)
{
minim=min(minim, Arb[nod]);
return;
}
int mij=(left+right)/2;
if(start<=mij) Query(2*nod, left, mij);
if(mij<finish) Query(2*nod+1, mij+1, right);
}
int main()
{
FILE *f1=fopen("stalpi.in", "r"), *f2=fopen("stalpi.out", "w");
int i, j, p, q, c, L, R;
fscanf(f1, "%d\n", &N);
for(i=1; i<=N; i++)
{
fscanf(f1, "%d %d %d %d\n", &P[i].x, &P[i].c, &P[i].st, &P[i].dr);
S[i]=P[i].x;
P[i].st=P[i].x-P[i].st;
P[i].dr=P[i].x+P[i].dr;
}
S[0]=-INF;
sort(S, S+N+1);
sort(P+1, P+N+1, cmp);
memset(best, INF, sizeof(best));
memset(Arb, INF, sizeof(Arb));
Val=0; Pos=0; Update(1, 0, N);
best[0]=0;
for(i=1; i<=N; i++)
{
L=lower_bound(S, S+N+1, P[i].st)-S-1;
R=lower_bound(S, S+N+1, P[i].dr+1)-S-1;
start=L; finish=N; minim=INF;
Query(1, 0, N);
best[R]=min(best[R], minim + P[i].c);
Val=best[R]; Pos=R;
Update(1, 0, N);
}
fprintf(f2, "%d\n", best[N]);
fclose(f1); fclose(f2);
return 0;
}