Cod sursa(job #764605)

Utilizator maritimCristian Lambru maritim Data 5 iulie 2012 17:33:19
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

FILE *f = fopen("secv.in","r");
FILE *g = fopen("secv.out","w");

typedef struct
{
	int info,poz;
} numar;

typedef struct Compare
{
	bool operator () (const numar a,const numar b) { return a.info < b.info ;  }
} ICompare;

#define MaxN 5010
#define INF 9000000

int N,Nr,Max,Sol = INF,poz;
numar A[MaxN];
int Poz[MaxN];

void citire(void)
{
	fscanf(f,"%d ",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i].info);
}

void NumereUnice(void)
{
	numar C[MaxN];
	C[0].info = -1;
	
	for(int i=1;i<=N;i++)
		C[i].info = A[i].info,C[i].poz = i;
	
	sort(C+1,C+N+1,ICompare());
	
	for(int i=1;i<=N;i++)
	{
		if(C[i].info != C[i-1].info)
			++ Nr;
			
		A[C[i].poz].poz = Nr;
	}
}

void Rezolvare(void)
{
	NumereUnice();
	
	for(int i=1;i<=N;i++)
	{
		if(A[i].poz == 1)
			Poz[1] = i;
		else if(Poz[A[i].poz] < Poz[A[i].poz-1])
			Poz[A[i].poz] = Poz[A[i].poz-1];
			
		//printf("%d -> %d\n",A[i].poz,Poz[A[i].poz]);
		
		if(A[i].poz == Nr && Poz[A[i].poz] && Sol > i-Poz[A[i].poz]+1)
			Sol = i-Poz[A[i].poz]+1;
	}
	
	if(Sol == INF)
		Sol = -1;
}

int main()
{
	citire();
	Rezolvare();
	
	fprintf(g,"%d\n",Sol);
}