Cod sursa(job #181432)

Utilizator razvi9Jurca Razvan razvi9 Data 18 aprilie 2008 12:32:56
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<cstdio>
#include<algorithm>
const int inf=0x7fffffff;
int n,a[5001],b[5002],last[5001],rez[5001],m,i,j,x,min;
int number(int x)
{
	int st=1,dr=m,mij;
	while(st<dr)
	{
		mij=(st+dr)>>1;
		if(b[mij]==x) return mij;
		if(b[mij]<x) st=mij+1;
		else dr=mij-1;
	}
	return st;
}
int main()
{
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	std::sort(&b[1],&b[n+1]);
	j=0;
	for(i=1;i<=n;i++)
		if(b[i]!=b[j])
			b[++j]=b[i];
	m=j;
	for(i=1;i<=n;i++)
		if(a[i]==b[1])
		{
			rez[i]=1;
			last[1]=i;
		}
		else
		{
			j=number(a[i]);
			x=last[j-1];
			if(x)
			{
				rez[i]=rez[x]+i-x;
				last[j]=i;
			}
		}
	min=inf;
	for(i=1;i<=n;i++)
		if(a[i]==b[m] && rez[i] && rez[i]<min)
			min=rez[i];
	printf("%d\n",min==inf?-1:min);
	fclose(stdout);
	return 0;
}