Cod sursa(job #1851257)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 19 ianuarie 2017 16:07:04
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>

int v[5001], f[5001], *p[5001];
int n, dif=1;

using namespace std;

bool cmp( int *a, int *b )
{
    return *a<*b;
}

void normalizare( )
{
    int last, i;

    for( i=1;i<=n;i++ )
        p[i]=&v[i];

    sort(p+1,p+n+1,cmp);

    last=*p[1];

    for( i=1;i<=n;i++ )
    {
        if( *p[i]==last )
            *p[i]=dif;
        else
        {
            dif++;
            last=*p[i];
            *p[i]=dif;
        }
    }
}

int subsir( int a, int b )
{
    int i, j=1;

    for( i=a;i<=b && j<=dif;i++ )
        if( v[i]==j )
            j++;

    return (j==dif+1);
}


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

    int i, st, dr, cnt=0, lmin;

    scanf( "%d", &n );

    for( i=1;i<=n;i++ )
        scanf( "%d", &v[i] );

    normalizare();

    st=dr=1;
    lmin=n+1;

    while( dr<=n )
    {
        f[v[dr]]++;

        if( f[v[dr]]==1 )
            cnt++;

        while( cnt==dif && st<=dr )
        {
            if( dr-st+1<lmin && subsir(st,dr) )
                lmin=dr-st+1;

            f[v[st]]--;

            if( f[v[st]]==0 )
                cnt--;

            st++;
        }

        dr++;
    }

    if( lmin==n+1 )
        printf( "-1" );
    else
        printf( "%d", lmin );

    return 0;
}