Cod sursa(job #989648)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 26 august 2013 07:34:06
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<cstdio>
#include<cstring>
int a[5001],i,j,k,m,n,b[5001],c[5001],s,e,p=5001,l,f=1,g,h; 
int main()
{
    freopen("secv.in","r",stdin),
    freopen("secv.out","w",stdout),
    scanf("%d",&n),a[0]=-1;
    for(i=1;i<=n;i++)
          scanf("%d",a+i);
    while(1)
    {
          if(f>=n||(g<=h&&g))
               break;
          memset(b,0,sizeof(b));
          for(m=0,i=f;i<=n;i++)
          {
               if(a[b[m]]<a[i])
                     c[i]=b[m],b[++m]=i;
               for(j=0,k=m;j<k;)
               if(a[b[(j+k)/2]]<a[i])
                     j=(j+k)/2+1;
               else
                     k=(j+k)/2;
               if(a[i]<a[b[j]])
               {
                     if(j)
                           c[i]=b[j-1];
                     b[j]=i;
               }
          }
          for(i=m,j=b[m];i--;j=c[j])
               b[i]=j;
          for(g=0,s=f;s<b[m-1]&&!g;s++)
          {
               for(e=k=0;b[k]<s;k++);
               for(i=s;i<b[m-1];i++)
               for(l=1,j=k;j<m&&l;j++)
               if(a[i]==a[b[j]])
                     l=0,e++;
               if(e==b[m-1]-s&&e+1<p)
               {
                     p=e+1;
                     if(b[0]<=s)
                           g=1;
               }
          }
          f=b[m-1]+1,h++;
    }
    printf("%d",p==5001?-1:p);
}