Pagini recente » Cod sursa (job #2981914) | Cod sursa (job #2256271) | Cod sursa (job #1547185) | Cod sursa (job #1198420) | Cod sursa (job #492249)
Cod sursa(job #492249)
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010
struct stalp
{
int x, c, s, d;
} t[nmax];
int cmp(stalp a, stalp b)
{
return a.s<b.s;
}
int n, v[nmax];
long long a[nmax];
int search(int a, int b, int x)
{
int m, r=0;
while (a<=b)
{
m=(a+b)/2;
if (v[m]<x)
{
r=m;
a=m+1;
} else b=m-1;
}
return r;
}
void update(int p, long long val)
{
while (p)
{
a[p]=min(a[p], val);
p -=(p^(p-1))&p;
}
}
long long query(int p)
{
long long r=(long long) 1<<60;
while (p<=n)
{
r=min(r, a[p]);
p +=(p^(p-1))&p;
}
return r;
}
int main()
{
freopen("stalpi.in","r",stdin);
freopen("stalpi.out","w",stdout);
scanf("%d",&n);
int i, p, s, d;
long long c;
for (i=1; i<=n; i++)
{
scanf("%d %d %d %d",&v[i], &p, &s, &d);
t[i].c=p;
t[i].s=v[i]-s;
t[i].d=v[i]+d;
}
for (i=1; i<=n; i++) a[i]=(long long) 1<<60;
sort(v+1, v+n+1);
sort(t+1, t+n+1, cmp);
for (i=1; i<=n; i++)
{
p=search(1,n,t[i].s);
if (!p) c=0; else c=query(p);
c+=t[i].c;
p=search(1,n,t[i].d);
if (v[p+1]<=t[i].d && p<n) p++;
update(p,c);
}
printf("%lld\n",a[n]);
}