Pagini recente » Cod sursa (job #206050) | Cod sursa (job #298788) | Cod sursa (job #2737820) | Cod sursa (job #297428) | Cod sursa (job #1851257)
#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;
}