Cod sursa(job #138133)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 februarie 2008 21:51:16
Problema Heavy metal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
long int n,nn,i,j,k,a[200002],pv[200002],pn[200002],max,maxx[200002],aux;
void sh(long int i1,long int i2);
void hd(long int ic,long int nc);
int main()
{
	FILE *f,*g;f=fopen("heavymetal.in","r");g=fopen("heavymetal.out","w");
	fscanf(f,"%ld",&n);
	nn=2*n;
	for(i=1;i<=nn;i++)
	{ fscanf(f,"%ld",&a[i]);pv[i]=i;pn[i]=i;}
	for(i=nn/2;i>=1;i--)hd(i,nn);
	for(i=nn;i>=1;i--){sh(1,i);hd(1,i-1);}
	max=0;
	i=1;
	while(i<=nn)
	{ if(pv[i]%2==0)
	  { j=i+1;
	    while((a[i]==a[j])&&(pv[j]%2==0))j++;
	    for(k=i;k<j;k++)maxx[k]=a[k]-a[pn[pv[k]-1]]+maxx[pn[pv[k]-1]];
	    for(k=i;k<j;k++)if(max<maxx[k])max=maxx[k];
	    i=j;
	  }
	  else
	  {maxx[i]=max;i++;}
	}
	fprintf(g,"%ld\n",max);
	fcloseall();
	return 0;
}
void sh(long int i1,long int i2)
{
	aux=a[i1];a[i1]=a[i2];a[i2]=aux;
	aux=pv[i1];pv[i1]=pv[i2];pv[i2]=aux;
	pn[pv[i1]]=i1;pn[pv[i2]]=i2;
}
void hd(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=ic+1;
	if(is>nc)return;
	if(is<nc)
	 if((a[is1]>a[is])||((a[is1]==a[is])&&(pv[is1]%2)&&(pv[is]%2==0)))
	  is=is1;
	if((a[is]>a[ic])||((a[is]==a[ic])&&(pv[is]%2)&&(pv[ic]%2==0)))
	  {sh(is,ic);hd(is,nc);}
}