#include <bits/stdc++.h>
#define DIM 100005
#define ll long long
using namespace std;
ll arb[4*DIM],best[DIM];
struct stalp{
int l,r,x,c;
};
stalp v[DIM];
bool cmp1(stalp a,stalp b) {
return a.x<b.x;
}
struct interval{
int st,dr,c;
};
interval p[DIM];
bool cmp2(interval a,interval b) {
if (a.st==b.st) return a.dr<b.dr;
return a.st<b.st;
}
int n;
int GetLeft(int pos) {
int le=1,ri=pos,sol=pos;
while (le<=ri) {
int mij=(le+ri)/2;
if (v[mij].x>=v[pos].x-v[pos].l) sol=mij,ri=mij-1;
else le=mij+1;
}
return sol;
}
int GetRight(int pos) {
int le=pos,ri=n,sol=pos;
while (le<=ri) {
int mij=(le+ri)/2;
if (v[mij].x<=v[pos].x+v[pos].r) sol=mij,le=mij+1;
else ri=mij-1;
}
return sol;
}
ll sol;int v1,v2,pos;
void update(int nod,int le,int ri,ll value) {
if (le==ri) arb[nod]=value;
else {
int mij=(le+ri)/2;
if (pos<=mij) update(2*nod,le,mij,value);
else update(2*nod+1,mij+1,ri,value);
arb[nod]=min(arb[2*nod],arb[2*nod+1]);
}
}
void query(int nod,int le,int ri) {
if (v1<=le && ri<=v2) sol=min(sol,arb[nod]);
else {
int mij=(le+ri)/2;
if (v1<=mij) query(2*nod,le,mij);
if (mij<v2) query(2*nod+1,mij+1,ri);
}
}
int main()
{ int i,j,Max=0;ll INF,val,ans;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
f>>n;
for (i=1;i<=n;++i)
f>>v[i].x>>v[i].c>>v[i].l>>v[i].r,Max=max(Max,v[i].c);
INF=ans=1LL*Max*n+1;
for (i=1;i<=4*n;++i)
arb[i]=INF;
sort(v+1,v+n+1,cmp1);
for (i=1;i<=n;++i)
p[i].st=GetLeft(i),p[i].dr=GetRight(i),p[i].c=v[i].c;
sort(p+1,p+n+1,cmp2);
for (i=1;i<=n;++i)
best[i]=INF;
for (i=1;i<=n;++i) {
v1=p[i].st-1,v2=n,sol=INF;
if (v1>=1) query(1,1,n);
else sol=0;
val=sol+p[i].c;
pos=p[i].dr;
best[pos]=min(best[pos],val);
update(1,1,n,best[pos]);
}
g<<best[n]<<'\n';
return 0;
}