Cod sursa(job #295973)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 3 aprilie 2009 21:22:02
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>
#include<string.h>
long a[5005],c[5005],n,i,lm,st,j,aa[5005];
long partit(long a[],long st,long dr)
{long i,j,m,piv,aa;
 m=(st+dr)/2;
 piv=a[m];
 i=st-1;
 j=dr+1;
 while(1)
  {do{++i;} while(a[i]<piv);
   do{--j;} while(a[j]>piv);
   if (i<j)
	 {aa=a[i];a[i]=a[j];a[j]=aa;}
	   else
	 return j;
  }
}
void quicks(long a[ ],long st,long dr)
{long p;
 if (st<dr)
   {p=partit(a,st,dr);
	quicks(a,st,p);
	quicks(a,p+1,dr);
   }
}
int main()
{
 freopen("secv.in","r",stdin);
 freopen("secv.out","w",stdout);
 scanf("%ld",&n);
 for(i=1;i<=n;++i)
    scanf("%ld",&a[i]);
 if(n==0){printf("0\n");return 0;}
 memcpy(aa,a,sizeof(a));
 quicks(aa,1,n);
 for(i=1;i<=n;++i)
    if(aa[i]!=aa[i-1])c[++c[0]]=aa[i];
 lm=n+1;
 for(i=1;i<=n;++i)
    if(c[1]==a[i])
      {st=2;
       j=i;
       while(st<=c[0]&&j<=n)
        {++j;
         if(a[j]==c[st])
           ++st;}
       if(j<=n)if(j-i+1<lm)lm=j-i+1;}
 if(lm==n+1)printf("-1\n");
       else printf("%ld\n",lm);
 return 0;
}