Pagini recente » Cod sursa (job #2228005) | Cod sursa (job #1954682) | Cod sursa (job #1281370) | Cod sursa (job #2234669) | Cod sursa (job #1852029)
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int NMAX = 5000;
int v[NMAX + 5] , t[NMAX + 5] , p[NMAX + 5] , f[NMAX + 5];
typedef pair<int,int> ii;
deque <ii> q;
int main()
{
freopen("secv.in" , "r" , stdin);
freopen("secv.out" , "w" , stdout);
int n , i , cnt , st , dr , med , k , lmin , q , w;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++)
scanf("%d" , &v[i]) , t[i] = v[i];
sort(t + 1 , t + n + 1);
cnt = 0;
v[n + 1] = 2000000001;
for(i = 1 ; i <= n ; i ++)
if(t[i] != t[i + 1])
p[++ cnt] = t[i];
for(i = 1 ; i <= n ; i ++)
{
st = 1;
dr = cnt;
while(st <= dr)
{
med = (st + dr) / 2;
if(p[med] == v[i])
{
v[i] = med;
break;
}
else if(p[med] < v[i])
st = med + 1;
else
dr = med - 1;
}
}
k = cnt;
cnt = 0;
f[0] = 1;
lmin = n + 1;
for(st = dr = 1 ; dr <= n ; dr ++)
{
if(f[v[dr] - 1] == 0)
continue;
else if(f[v[dr] - 1] > 0)
{
cnt ++;
f[v[dr]] ++;
if(cnt == k)
while(st <= dr && cnt == k)
{
if(dr - st + 1 < lmin)
lmin = dr - st + 1;
f[v[st]] --;
if(f[v[st]] == 0)
{
cnt --;
for(i = st + 1 ; i <= k ; i ++)
f[i] = 0;
}
st ++;
}
}
}
if(lmin < n + 1)
printf("%d\n" , lmin);
else
printf("-1\n");
return 0;
}