#include<bits/stdc++.h>
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
struct elem
{
int x,c,s,d;
} v[100200];
int cmp(elem aa, elem bb)
{
return aa.d<bb.d;
}
int n,k,aint[4*100200],a[100200],lazy[4*100200];
void propagate(int nod, int st, int dr)
{
aint[nod]=min(aint[nod],lazy[nod]);
if(st!=dr)
{
lazy[2*nod]=min(lazy[2*nod],lazy[nod]);
lazy[2*nod+1]=min(lazy[2*nod+1],lazy[nod]);
}
}
void update(int nod, int st, int dr, int l, int r,int val)
{
if(st==l && dr==r)
{
lazy[nod]=min(lazy[nod],val);
propagate(nod,st,dr);
}
else
{
int mij=(st+dr)/2;
propagate(nod,st,dr);
propagate(2*nod,st,mij);
propagate(2*nod+1,mij+1,dr);
if(r<=mij)
update(2*nod,st,mij,l,r,val);
else if(l>=mij+1)
update(2*nod+1,mij+1,dr,l,r,val);
else
{
update(2*nod,st,mij,l,mij,val);
update(2*nod+1,mij+1,dr,mij+1,r,val);
}
aint[nod]=min(aint[2*nod],aint[2*nod+1]);
}
}
int query(int nod, int st, int dr, int l, int r)
{
propagate(nod,st,dr);
if(st==l && dr==r)
return aint[nod];
else
{
int mij=(st+dr)/2;
if(r<=mij)
return query(2*nod,st,mij,l,r);
else if(l>=mij+1)
return query(2*nod+1,mij+1,dr,l,r);
else
return min(query(2*nod,st,mij,l,mij),query(2*nod+1,mij+1,dr,mij+1,r));
}
}
int caut_bin(int x)
{
int st=1,dr=k;
int retin=1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(a[mij]>x)
dr=mij-1;
else
st=mij+1,retin=mij;
}
return retin;
}
int caut_bin_op(int x)
{
int st=1,dr=k,retin=1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(a[mij]>=x)
retin=mij,dr=mij-1;
else
st=mij+1;
}
return retin;
}
signed main()
{
int i,j,nr;
f>>n;
a[++k]=0;
v[1].x=0;
v[1].s=0;
v[1].d=0;
v[1].c=0;
n++;
for(i=2; i<=n; i++)
{
f>>v[i].x>>v[i].c>>v[i].s>>v[i].d;
v[i].s=v[i].x-v[i].s;
v[i].d=v[i].x+v[i].d;
a[++k]=v[i].x;
}
sort(v+1,v+n+1,cmp);
sort(a+1,a+k+1);
for(i=0; i<=4*n; i++)
aint[i]=INF,lazy[i]=INF;
update(1,1,k,1,1,0);
for(i=2; i<=n; i++)
{
int st=caut_bin(v[i].d);
st=max(1LL,st);
st=min(k,st);
int dr=caut_bin_op(v[i].s);
dr=max(1LL,dr);
dr=min(k,dr);
//if(st>=1 &&dr<=k)
//{
nr=query(1,1,k,dr,k);
int val=nr+v[i].c;
if(min(dr+1,k)<=st)
update(1,1,k,min(dr+1,k),st,val);
//}
}
g<<query(1,1,n,n,n);
return 0;
}