Cod sursa(job #24556)

Utilizator hellraizerChiperi Matei hellraizer Data 2 martie 2007 21:05:49
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>

#define N_MAX 5001

int n,m,d[N_MAX],ap[N_MAX];
long v[N_MAX],s[N_MAX];

void citire(){
	FILE *fin=fopen("secv.in","r");
	fscanf(fin,"%d",&n);
	for (int i=1;i<=n;i++)
		fscanf(fin,"%ld",&v[i]);
	fclose(fin);
}

void interclasare(int x,int m,int y){
	long b[N_MAX],k1=x,k2=m+1,k=0;
	while (k1<=m&&k2<=y)
		if (s[k1]<s[k2])
			b[++k]=s[k1++];
		else
			b[++k]=s[k2++];
	while (k1<=m)
		b[++k]=s[k1++];
	while (k2<=y)
		b[++k]=s[k2++];
	for (k1=1;k1<=k;k1++)
		s[x+k1-1]=b[k1];
}

void sortare(int x,int y){
	if (x!=y){
		int m=(x+y)/2;
		sortare(x,m);
		sortare(m+1,y);
		interclasare(x,m,y);
	}
}

void prelucrare(){
	int i,j;
	for (i=1;i<=n;i++)
		s[i]=v[i];
	sortare(1,n);
	m=1;
	for (i=2;i<=n;i++)
		if (s[i]!=s[m])
			s[++m]=s[i];
	for (i=1;i<=n;i++){
		for (j=1;j<=m;j++)
			if (s[j]==v[i])
				break;
		if (j==1){
			d[i]=1;
			ap[j]=i;
		}
		else
			if (ap[j-1]){
				d[i]=d[ap[j-1]]+i-ap[j-1];
				ap[j]=i;
			}
	}
}


void afisare(){
	FILE *fout=fopen("secv.out","w");
	int min=N_MAX;
	if (!ap[m])
		fprintf(fout,"-1\n");
	else{
		for (int i=1;i<=n;i++)
			if ((v[i]==s[m])&&(min>d[i]))
				min=d[i];
		fprintf(fout,"%d\n",min);
	}
	fclose(fout);
}

int main(){
	citire();
	prelucrare();
	afisare();
	return 0;
}