Cod sursa(job #867768)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 30 ianuarie 2013 08:24:03
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<cstdio>
int n,v[5003],b[5003],p[5003],m,k,l[5003],t=1,c[5003],d[5003],i,j,r,s;
 
int C(int x)
{int p=0,u=t,m;
m=(p+u)/2;
while(p<=u)
     {if(v[l[m]]<x&&v[l[m+1]]>=x) 
           return m;
     if(v[l[m+1]]<x) 
           p=m+1,m=(p+u)/2;
     else 
           u=m-1,m=(p+u)/2;}
return t;}
 
int main()
{freopen("secv.in","r",stdin),freopen("secv.out","w",stdout);
scanf("%d",&n);
for(b[1]=l[1]=i=1;i<=n;i++) 
       scanf("%d",v+i);
for(i=2;i<=n;i++)
       {r=C(v[i]),p[i]=l[r],b[i]=r+1,l[r+1]=i;
       if(t<r+1)   
                t=r+1;}
for(m=r=0,i=1;i<=n;i++)
if(m<b[i])
       m=b[i],r=i;
for(t=0,i=r;i;i=p[i])
       c[m-t]=v[i],d[m-t]=i,t++;
for(i=1;i<=m&&d[m]>=m+d[i];i++)
       {for(t=0,j=d[i];j<=d[m];j++)
       for(k=1;k<=m;k++)
       if(v[j]==c[k])
              t++;
       if(t==d[m]-d[i]+1)
              {printf("%d",t);
              return 0;}}
printf("-1");
return 0;}