Cod sursa(job #388559)

Utilizator ionutz32Ilie Ionut ionutz32 Data 30 ianuarie 2010 13:49:55
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
struct nod
{
	int poz;
	nod *adr;
};
nod *u,*p;
int n,v[5005],i,s[5005],x,j,a,b,mid,min,poz[5005],din[5005][5005],len;
int sfarsit(int elem,int pos)
{
	int ret;
	if (din[elem][pos])
		return din[elem][pos];
	while (pos<=n && v[pos]!=s[elem])
		++pos;
	if (v[pos]==s[elem])
		if (elem==x)
			ret=pos;
		else
			ret=sfarsit(elem+1,pos+1);
	else
		ret=-1;
	din[elem][pos]=ret;
	return ret;
}
int main()
{
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);
	scanf("%d",&n);
	min=2100000000;
	for (i=1;i<=n;++i)
	{
		scanf("%d",&v[i]);
		a=1;
		b=x;
		while (a<=b)
		{
			mid=a+(b-a)/2;
			if (v[i]<=s[mid])
				b=mid-1;
			else
				a=mid+1;
		}
		if (s[b+1]!=v[i] || (x==0 && v[i]==0))
		{
			for (j=x;j>b;--j)
				s[j+1]=s[j];
			s[b+1]=v[i];
			++x;
		}
		if (v[i]<min)
		{
			min=v[i];
			p=new nod;
			p->poz=i;
			p->adr=NULL;
		}
		else
			if (v[i]==min)
			{
				u=new nod;
				u->poz=i;
				u->adr=p;
				p=u;
			}
	}
	min=6000;
	for (u=p;u!=NULL;u=u->adr)
	{
		len=sfarsit(2,u->poz+1);
		if (len>-1)
		{
			len=len-u->poz+1;
			if (len<min)
				min=len;
		}
	}
	if (min<6000)
		printf("%d",min);
	else
		printf("%d",-1);
	return 0;
}