#include<fstream>
#define inf 20000000
#include<algorithm>
#include<cstring>
#define dim 100007
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out")
;
long A[3*dim],best[dim],i,j,L,R,a[dim],n;
struct cub{
long st,dr,cost,x;
}
v[dim];
inline long min(long a,long b){
if(a<b)
return a;
return b;
}
long bs1( int val ) {
int st,dr,m,sol;
st=0;
dr=n;
while(st<=dr) {
m=(st+dr)/2;
if(a[m]<val && a[m+1]>=val){
return m;
}
if(a[m]>=val){
dr=m-1;
}
else{
st=m+1;
sol=m;
}
}
return sol;
}
int bs2(int val) {
int st,dr,m,sol;
st=0;dr=n;
while(st<=dr) {
m=(st+dr)/2;
if(a[m]<=val && a[m+1]>val){
return m;
}
if(a[m]>val){
dr=m-1;
}
else{
st=m+1;
sol=m;
}
}
return sol;
}
int cmp(cub a ,cub b ){
return a.dr<b.dr;
}
int querry (int nod ,int st ,int dr, int l,int r) {
long m=(st+dr)/2;
long ans;
if(l<=st && dr<=r) {
return A[nod];
}
ans=inf;
if(l<=m)
ans=min(ans,querry(2*nod,st,m,l,r));
else
ans=min(ans,querry(2*nod+1,m+1,dr,l,r));
return ans;
}
void update (int nod ,int st, int dr , int poz , int val ){
long m=(st+dr)/2;
if(st==dr){
A[nod]=val;
return ;
}
if(poz<=m)
update(2*nod,st,m,poz,val);
if(m<poz)
update(2*nod+1,m+1,dr,poz,val);
a[nod]=min(a[2*nod],a[2*nod+1]);
}
int main () {
f>>n;
for(i=1;i<=n;++i){
f>>v[i].x>>v[i].cost>>v[i].st>>v[i].dr;
a[i]=v[i].x;
v[i].st=v[i].x-v[i].st;
v[i].dr=v[i].x+v[i].dr;
}
//best[i]=costul minim pentru a acoperi primii n stalpi
sort(a+1,a+1+n);
sort(v+1,v+1+n,cmp);
memset(A,inf,sizeof(A));
memset(best,inf,sizeof(best));
update(1,0,n,0,0);
best[0]=0;
for(i=1;i<=n;++i){
L=bs1(v[i].st);
R=bs2(v[i].dr);
best[R]=min(best[R],querry(1,0,n,L,R)+v[i].cost);
update(1,0,n,R,best[R]);
}
g<<best[n]<<"\n";
return 0;
}