Cod sursa(job #279677)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 12 martie 2009 22:05:07
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
#include <algorithm>

using namespace std;

#define MAXN 100010
#define MAXX 262144
#define INF 1000000000
#define ff first 
#define ss second
#define mp make_pair

int N, L;
int ileft, iright;
int value;
pair < pair <int, int>, int > B[MAXN];
int X[MAXN];
int C[MAXN], best[MAXX];

inline int min(int a, int b)
{
	if (a < b) return a;
	return b;
}

inline int search(int x)
{
	int front = 1, middle, back = N, rez = 0;

	while (front <= back)
	{
		middle = (front + back) / 2;

		if (X[middle] < x)
		{
			rez = middle;
			front = middle + 1;
		}
		else back = middle - 1;
	}

	return rez;
}

inline int search2(int x)
{
	int front = 1, middle, back = N, rez = 0;

	while (front <= back)
	{
		middle = (front + back) / 2;
		
		if (B[middle].ff.ff >= x)
		{
			rez = middle;
			back = middle - 1;
		}
		else front = middle + 1;
	}

	return rez;
}

inline int query(int p, int r, int nod)
{
	if (ileft <= p && r <= iright) return best[nod];
	else {
			 int q = (p+r) / 2;
			 int rez = INF;
 
			 if (ileft <= q) rez = query(p, q, nod*2);
			 if (q < iright) rez = min(rez, query(q+1, r, nod*2+1));

			 return rez;
		 }
}

inline void update(int p, int r, int nod)
{
	if (p == r) best[nod] = value;
	else {
			 int q = (p+r) / 2;

			 if (ileft <= q) update(p, q, nod*2);
			 if (q < iright) update(q+1, r, nod*2+1);

			 best[nod] = min(best[nod*2], best[nod*2+1]);
		 }
}

int main()
{
	ifstream fin("stalpi.in");
	ofstream fout("stalpi.out");
//	freopen("stalpi.in", "r", stdin);
//	freopen("stalpi.out", "w", stdout);

	int i, S, D, Cost;

	fin >> N;
//	scanf("%d ", &N);

	for (i = 1; i <= N; i++)
	{
		fin >> X[i] >> Cost >> S >> D;
		D = X[i] + S;
		S = X[i] - S;
		B[i] = mp( mp(D, S), Cost);

	//	scanf("%d %d %d %d ", &X[i], &Cost[i], &S[i], &D[i]);
	}

	for (L = 1; L < N; L <<= 1);
	for (i = 1; i < 2*L; i++) best[i] = INF;

	sort(B+1, B+N+1);
	sort(X+1, X+N+1);

	for (i = 1; i <= N; i++)
	{
		ileft = search(B[i].ff.ss);	

		if (ileft == 0) C[i] = B[i].ss;
		else {
				 ileft = search2(X[ileft]);
				 iright = i-1;

		 		 if (ileft > iright) C[i] = INF;
			 	 else C[i] = query(1, L, 1) + B[i].ss;
			 }

		ileft = iright = i;
		value = C[i];
		update(1, L, 1);
	}

	ileft = search2(X[N]);
	iright = N;

//	printf("%d\n", query(1, L, 1));
	fout << query(1, L, 1) << endl;

	return 0;
}