Cod sursa(job #80014)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 august 2007 12:16:23
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
long int n,i,a[502],o[502],aux,sol,pc,lev,p[502],u[502],l[502],m[502],p1,p2;
void heapdown(long int ic,long int nc);
void swap(long int i1,long int i2);
int main()
{
	FILE *f,*g;f=fopen("secv.in","r");g=fopen("secv.out","w");
	fscanf(f,"%ld",&n);for(i=1;i<=n;i++){ fscanf(f,"%ld",&a[i]);o[i]=i;m[i]=10;}
	for(i=n/2;i>=1;i--)heapdown(i,n);for(i=n;i>=1;i--){ swap(1,i);heapdown(1,i-1);}
	pc=1,lev=1;l[1]=1;
	for(i=2;i<=n;i++){ if(a[i]>a[i-1]){p[lev]=pc;u[lev]=i-1;pc=i;lev++;}l[i]=lev;}p[lev]=pc;u[lev]=n;
	for(i=p[1];i<=u[1];i++)
	 m[i]=1;
	for(i=2;i<=lev;i++)
	 for(p1=p[i-1];p1<=u[i-1];p1++)
	  for(p2=p[i];p2<=u[i];p2++)
	   if(o[p1]<o[p2])
	    if(m[p2]>m[p1]+o[p2]-o[p1])
	     m[p2]=m[p1]+o[p2]-o[p1];
	sol=10000;
	for(i=p[lev];i<=u[lev];i++)
	 sol=(sol<m[i])?sol:m[i];
	if(sol==10000)sol=-1;
	fprintf(g,"%ld\n",sol);
	fcloseall();
	return 0;
}
void heapdown(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc) return;
	if(is<nc)
	 { if(a[is1]>a[is]) is=is1;
	   else if(a[is1]==a[is]&&o[is1]>o[is]) is=is1;
	 }
	if(a[is]>a[ic]){swap(is,ic);heapdown(is,nc);return;}
	if(a[is]==a[ic]&&o[is]>o[ic]){swap(is,ic);heapdown(is,nc);}
}
void swap(long int i1,long int i2)
{
	aux=a[i1];a[i1]=a[i2];a[i2]=aux;
	aux=o[i1];o[i1]=o[i2];o[i2]=aux;
}