Cod sursa(job #491938)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 12 octombrie 2010 20:49:10
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
#define nmax 100010

struct stalp
{
	int x, c, s, d;
} v[nmax];

int cmp(stalp a, stalp b)
{
	return a.x<b.x;
}

int n;
set <pair <long long, int> > s;
pair <long long, int> d[nmax];
long long best[nmax];

int main()
{
	freopen("stalpi.in","r",stdin);
	freopen("stalpi.out","w",stdout);
	scanf("%d",&n);
	int i, p, j, st, dr;
	long long x;
	for (i=1; i<=n; i++) scanf("%d %d %d %d",&v[i].x, &v[i].c, &v[i].s, &v[i].d);
	sort(v+1, v+n+1, cmp);
	st=dr=1;
	d[1]=make_pair(0,0);
	for (i=1; i<=n; i++)
	{
		while(st<=dr && v[d[st].second].x<v[i].x-v[i].s) st++;
		x=d[st].first+v[i].c;
		s.insert(make_pair(x,v[i].x+v[i].d));
		while ((*(s.begin())).second<v[i].x) s.erase(s.begin());
		best[i]=(*(s.begin())).first;
		while (best[i]<d[dr].first && dr>=st) dr--;
		dr++;
		d[dr]=make_pair(best[i], i);
	}
	printf("%lld\n",best[n]);
}