Pagini recente » Cod sursa (job #2964699) | Cod sursa (job #1831119) | Cod sursa (job #2332455) | Cod sursa (job #2913681) | Cod sursa (job #2546525)
#include <bits/stdc++.h>
using namespace std;
ifstream in("stalpi.in");
ofstream out("stalpi.out");
const int inf=2e9,maxn=1e5;
struct stalp
{
int x,c,s,d;
};
stalp a[1+maxn];
bool cmp1(stalp aa,stalp bb)
{
return aa.x<bb.x;
}
bool cmp2(stalp aa,stalp bb)
{
if(aa.s!=bb.s)
return aa.s<bb.s;
return aa.d<bb.d;
}
int lsb(int x)
{
return x&-x;
}
struct bit
{
int aib[1+maxn];
bit(int n=0)
{
for(int i=1;i<=n;++i)
aib[i]=inf;
}
void add(int val,int poz,int n)
{
while(poz)
{
aib[poz]=min(aib[poz],val);
poz-=lsb(poz);
}
}
int query(int poz,int n)
{
int sol;
sol=inf;
while(poz<=n)
{
sol=min(sol,aib[poz]);
poz+=lsb(poz);
}
return sol;
}
};
int n;
int getpoz(int xx)
{
int l,r;
l=1,r=n;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid].x>xx)
r=mid-1;
else l=mid+1;
}
return r;
}
int main()
{
in>>n;
for(int i=1;i<=n;++i)
in>>a[i].x>>a[i].c>>a[i].s>>a[i].d;
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;++i)
{
int xx=a[i].x-a[i].s;
a[i].s=getpoz(xx);
xx=a[i].x+a[i].s;
a[i].d=getpoz(xx);
}
bit best(n);
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;++i)
{
int mincost=a[i].c;
if(a[i].s>0)
mincost+=best.query(a[i].s,n);
best.add(mincost,a[i].d,n);
}
out<<best.aib[n];
return 0;
}