Cod sursa(job #133956)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 10 februarie 2008 01:56:19
Problema Stalpi Scor Ascuns
Compilator cpp Status done
Runda Marime 1 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define mp make_pair
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define PII pair <int,int>
#define f first
#define s second
#define nmax 100111
#define inf 1000111000
#define pt(i) (1<<(i))

int n,S[nmax],A[nmax];
pair < PII,PII > P[nmax];

int find1(int x)
{
	int i,j;
	for(i=16,j=0;i>=0;--i)
		if(j+pt(i)<n&&P[j+pt(i)].f.f<x)
			j+=pt(i);
	return n-j;
}

int query(int i)
{
	int aux=S[i];
	for(;i;i&=i-1)
		if(S[i]<aux)
			aux=S[i];
	return aux;
}

void update(int i,int aux)
{
	for(;i<=n;i=(i|(i-1))+1)
		if(S[i]>aux)
			S[i]=aux;
}

int main()
{
	freopen("stalpi.in","r",stdin);
	freopen("stalpi.out","w",stdout);
	int i,a,b,c,d;
	scanf("%d",&n);
	FOR(i,0,n)
	{
		scanf("%d %d %d %d",&a,&b,&c,&d);
		P[i]=mp(mp(a,b),mp(c,d));
		S[i+1]=inf;
	}
	sort(P,P+n);
	FOR(i,0,n)
	{
		A[i]=P[i].f.s;
		a=P[i].f.f-P[i].s.f;
		if(a>P[0].f.f)
			A[i]+=query(find1(a));
		update(find1(P[i].f.f+P[i].s.s+1),A[i]);	
	}
	printf("%d\n",query(find1(P[n-1].f.f+1)));
	return 0;
}