Pagini recente » Cod sursa (job #2003775) | Cod sursa (job #2425356) | Cod sursa (job #520567) | Cod sursa (job #244866) | Cod sursa (job #2765396)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int const N = 5001;
int v [N] , v2 [N] , v3 [N];
vector <int> E;
int bsearch (int n , int x){
int pas = (1 << 12) , r = 0;
while (pas){
if (pas + r <= n && v [v2 [pas + r]] < x)
r += pas;
pas >>= 1;
}
return 1 + r;
}
int main()
{
freopen ("secv.in" , "r" , stdin);
freopen ("secv.out" , "w" , stdout);
int n , k = 0 , ans = -1;
scanf ("%d" , &n);
for(int i = 1 ; i <= n ; ++ i){
scanf ("%d" , &v [i]);
int pos = bsearch (k , v [i]);
if (pos > k)
++ k;
v2 [pos] = i;
}
copy (v + 1 , v + 1 + n , v3 + 1);
sort (v3 + 1 , v3 + 1 + n);
int last = v3 [1] , nrd = 1;
for(int i = 2 ; i <= n ; ++ i)
if (v3 [i] != v3 [i - 1])
++ nrd;
if (k < nrd){
printf ("-1");
return 0;
}
for(int i = 1 ; i <= n ; ++ i)
if (v [i] == v [v2 [k]])
E.push_back (i);
for(int i = 0 ; i < E.size () ; ++ i){
int last = v [E [i]] , np = last , i2 = k - 1;
for(int j = E [i] - 1 ; j && i2 ; -- j){
if (v [j] == v [v2 [i2]]){
np = j;
-- i2;
last = v [v2 [i2]];
}
}
if (i2 == 0)
ans = min (ans , E [i] - np + 1);
}
printf ("%d" , ans);
return 0;
}