Cod sursa(job #479831)

Utilizator MirceaTanaseMircea Tanase MirceaTanase Data 25 august 2010 13:59:56
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <algorithm>
#include <stdio.h>

#define MAX 100010
#define mp make_pair
#define f first
#define s second

using namespace std;

int n, rx;
int x[MAX], sol[MAX];
pair <pair <int, int>, int> vctInt[MAX];
pair <int, int> deqEl[MAX];

int main()
{
	freopen("stalpi.in", "r", stdin);
	freopen("stalpi.out", "w", stdout);
	
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
	{
		int c, s, d;
		scanf("%d %d %d %d", &x[i], &c, &s, &d);

		vctInt[i] = mp(mp(x[i] - s, x[i] + d), c);
	}

	sort(x + 1, x + 1 + n);
	sort(vctInt + 1, vctInt + 1 + n);

	int deqSt = 1, deqFn = 0;
	for (int i = 1; i <= n; i++)
	{
		for (; rx <= n && x[rx] < vctInt[i].f.f; rx++)
		{
			for (; deqEl[deqSt].s < x[rx]; deqSt++);

			sol[rx] = deqEl[deqSt].f;
		}

		deqEl[++deqFn] = mp(sol[rx - 1] + vctInt[i].s, vctInt[i].f.s);

		for (; deqFn > deqSt; )
			if (deqEl[deqFn].f < deqEl[deqFn - 1].f)
			{
				swap(deqEl[deqFn], deqEl[deqFn - 1]);

				deqFn--;
			}
			else break;
	}
	
	for (; rx <= n; rx++)
	{
		for (; deqEl[deqSt].s < x[rx]; deqSt++);
		
		sol[rx] = deqEl[deqSt].f;
	}

	printf("%d\n", sol[n]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}