Cod sursa(job #3167)

Utilizator crawlerPuni Andrei Paul crawler Data 21 decembrie 2006 13:51:28
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>

long x[5001], n, viz[5001];
long tmp[5001], v[5001];

void qsort(long st,long dr)
 {
   register long i=st,j=dr,sc=v[(st+dr)>>1],aux;
     do{
       while(v[i]<sc)
        ++i;
       while(v[j]>sc)
       --j;
       if(i<=j)
        {
          aux=tmp[i];
          tmp[i]=tmp[j];
          tmp[j]=aux;

          aux=v[i];
          v[i]=v[j];
          v[j]=aux;
          
          ++i;--j;
        }
      }while((i<=j));

    if(i<dr) qsort(i,dr);
    if(j>st) qsort(st,j);
 }

int main()
 {
   freopen("secv.in","r",stdin);
   freopen("secv.out","w",stdout);

   register long i, j, last, max;


   scanf("%ld",&n);
   for(i=1;i<=n;++i)
    {
     scanf("%ld",&v[i]);
     tmp[i]=i;
    }

   qsort(1,n);


   for(i=1;i<=n;++i)
    if(v[i]>v[1])
     break;
      else
     {
      viz[i]=1;
      x[i]=1;
     }

   last=i-1;
   ++i;

   for(;i<=n;++i)
    {
     x[i]=9999;
     viz[i]=0;
     for(j=last;v[j]==v[last];--j)
      if(tmp[i]>tmp[j] && viz[j])
       {
        viz[i]=1;
        if(tmp[i]-tmp[j]+x[j]<x[i])
         x[i]=tmp[i]-tmp[j]+x[j];
       }
       
     if(x[i]==9999)
      {
       x[i]=-1;
       viz[i]=0;
      }
      
     if(v[i+1]>v[i])
      last=i;
    }



   max=9999;
   
   for(i=n;v[i]!=v[last];--i)
    if((viz[i]) && (max>x[i]))
     max=x[i];

   if(max==9999)
    max=-1;

   printf("%ld",max);

   
   return 0;
 }