Cod sursa(job #709615)

Utilizator Robert29FMI Tilica Robert Robert29 Data 8 martie 2012 12:17:53
Problema Lupul Urias si Rau Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE*f=fopen("lupu.in","r");
FILE*g=fopen("lupu.out","w");
int nr,n,x,l;
long long sol;
struct oi
{
	int d,a;
}v[100001];
int cmp(oi a,oi b)
{
	return a.d<b.d;
}
struct heap 
{
	int x,i;
}d[100001];
char viz[100001];
void insert(int x,int i)
{
	d[++nr].x=x;
	d[i].i=nr;

	int k=nr;
	while(k>1&&d[k/2].x<d[k].x)
	{
		d[0]=d[k];
		d[k].x=d[k/2].x;
		d[k/2].x=d[0].x;
		d[k].i=d[k/2].i;
		d[k/2].i=d[0].i;
		k/=2;
	}
}
void down(int x,int k)
{
	d[k]=d[nr--];
	int son;
	do
	{
		son=0;
		if(2*k<=nr)
			son=2*k;
		if(2*k+1<=nr&&d[son].x<d[2*k+1].x)
			son++;
		if(d[son].x>d[k].x)
		{
			d[0]=d[k];
			d[k].x=d[son].x;
			d[son].x=d[0].x;
			d[k].i=d[son].i;
			d[son].i=d[0].i;
			k=son;
		}
		else
			son=0;
		
	}while(son);

}
int main()
{
	fscanf(f,"%d%d%d",&n,&x,&l);
	for(int i=1;i<=n;++i)
		fscanf(f,"%d%d",&v[i].d,&v[i].a);
	
	sort(v+1,v+n+1,cmp);
	
	for(int i=1;i<=n;++i)
		if(v[i].d<=x)
			insert (v[i].a,i);
		else 
			break;
	int ll=l;
	while(nr)
	{
		int max=0;
		for(int i=nr;v[i].d+ll>x&&i;--i)
			if(max<v[i].a)
				max=v[i].a;
			
		sol+=max;
		
		
		for(int i=nr;v[i].d+ll>x&&i;--i)
			--nr;
			
		ll+=l;
	}
	fprintf(g,"%lld",sol);
	
	fclose(f);
	fclose(g);
	return 0;
}