Pagini recente » Cod sursa (job #2920824) | Cod sursa (job #1355601) | Cod sursa (job #245274) | Cod sursa (job #829759) | Cod sursa (job #1892358)
#include<bits/stdc++.h>
#define maxN 100005
#define lsb(i) (i&(-i))
#define INF 0x3f3f3f3f
using namespace std;
typedef struct tip
{
int cost,st,dr;
};
tip v[maxN];
int x[maxN],AIB[maxN],n,y,val;
inline int min(int a,int b)
{
return a<b?a:b;
}
bool cmp(tip a,tip b)
{
return a.dr<b.dr;
}
void update(int pos,int val)
{
for(int i=pos;i>=1;i-=lsb(i))
AIB[i]=min(AIB[i],val);
}
int query(int pos)
{
int q=INF;
for(int i=pos;i<=n;i+=lsb(i))
q=min(q,AIB[i]);
return q;
}
int main()
{
freopen("stalpi.in","r",stdin);
freopen("stalpi.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x[i],&v[i].cost,&v[i].st,&v[i].dr);
v[i].st=x[i]-v[i].st;
v[i].dr=x[i]+v[i].dr;
}
memset(AIB,INF,sizeof(AIB));
sort(x+1,x+n+1);
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
{
y=lower_bound(x+1,x+n+1,v[i].st)-x-1;
val=v[i].cost;
if(y) val+=query(y);
y=upper_bound(x+1,x+n+1,v[i].dr)-x-1;
update(y,val);
}
printf("%d\n",AIB[n]);
return 0;
}