Cod sursa(job #18781)

Utilizator TabaraTabara Mihai Tabara Data 18 februarie 2007 14:04:25
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
/*
Author:Tabara Mihai 
Lang: C++
Punctaj: 100 puncte
Problema: "Secv" - http://infoarena.ro/
*/

#include <stdio.h>

#define in "secv.in"
#define out "secv.out"
#define _INF_ 1000000000
#define NMAX 5001

int n, m;
int t[NMAX], a[NMAX], c[NMAX];
int nrsol, aux;

void QSort(int,int);

int main()
{
    freopen( in, "r", stdin );
    freopen ( out, "w", stdout );
    int i, j, k;
    scanf( "%d", &n );
    for ( i = 0; i < n; ++i )
    {
        scanf( "%d", &a[i] );
        t[i] = a[i];
    }    
    
    QSort( 0, n-1 );
    c[0] = t[0];
    m++;
    for ( i = 1; i < n; ++i )
    {
        if ( t[i] != t[i-1] ) c[m++] = t[i];
    }
    nrsol = _INF_;
    //am construit pana aici sirul C al sirului crescator din sirul initial
    for ( i = n - 1; i >= 0; --i )
    {
        if ( a[i] == c[m-1] ) //daca ultima pozitie coincide
        {
             k = i;//retin unde e i-ul
             for ( j = m - 2; j >= 0; --j )
             {
                 while ( k >= 0 && a[k] != c[j] ) k--;
                 if ( k < 0 ) break;
             }
             if ( j == - 1 && nrsol > i - k + 1 ) nrsol = i - k + 1;
        }
    }
    printf( "%d\n", nrsol == _INF_ ? -1 : nrsol );
}
    
void QSort(int st,int dr)
{
     int i = st - 1, j = dr + 1;
     int pivot = t[st];
     do
     {
         do { i++; } while ( t[i] < pivot );
         do { j--; } while ( t[j] > pivot );
         if ( i <= j )
         {
              aux = t[i];
              t[i] = t[j];
              t[j] = aux;
         }
     } while ( i <= j );
     if ( i < dr ) QSort( i, dr );
     if ( st < j ) QSort( st, j );
}