Cod sursa(job #67875)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 iunie 2007 19:36:39
Problema Orase Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
long int n,m,d[50001],l1[50001],l2[50001],i,p,face,up,down,d1,d2,d3,sol,aux;
int swap(long int i1,long int i2);
int heapdown(long int ic,long int nc);
int main()
{
	FILE *f,*g;
	f=fopen("orase.in","r");
	g=fopen("orase.out","w");
	fscanf(f,"%ld%ld",&m,&n);
	for(i=1;i<=n;i++)
	fscanf(f,"%ld%ld",&d[i],&l1[i]);
	for(i=n/2;i>=1;i--)
	heapdown(i,n);
	for(i=n;i>=1;i--)
	{swap(1,i);heapdown(1,i-1);}
	for(i=n;i>=1;i--)d[i]-=d[i-1];
	d[1]=0;
	p=1;
	for(i=2;i<=n;i++)
	{
		if(d[i]==d[i-1])l2[p]=l1[i];
		else {p++;d[p]=d[i];l1[p]=l1[i];}
	}
	face=(l1[1]>l2[1])?l1[1]:l2[1];
	for(i=2;i<=p;i++)
	{
		face+=d[i];
		up=l1[i];
		down=l2[i];
		if(down)
		{ d1=face+up;sol=(d1>sol)?d1:sol;
		  d2=face+down;sol=(d2>sol)?d2:sol;
		  d3=up+down;sol=(d3>sol)?d3:sol;
		  face=(face>up)?face:up;
		  face=(face>down)?face:down;
		}
		else
		 { d1=face+up;sol=(d1>sol)?d1:sol;
		   face=(face>up)?face:up;
		 }
	}
	fprintf(g,"%ld",sol);
	fcloseall();
	return 0;
}
int swap(long int i1,long int i2)
{
	aux=d[i1];d[i1]=d[i2];d[i2]=aux;
	aux=l1[i1];l1[i1]=l1[i2];l1[i2]=aux;
	aux=l2[i1];l2[i1]=l2[i2];l2[i2]=aux;
	return 0;
}
int heapdown(long int ic,long int nc)
{
	long int is=2*ic,is1=2*ic+1;
	if(is>nc)return 0;
	if(is<nc) if(d[is1]>d[is]) is=is1;
	if(d[is]>d[ic]){ swap(ic,is);heapdown(is,nc);}
	return 0;
}