Cod sursa(job #2765396)

Utilizator DordeDorde Matei Dorde Data 26 iulie 2021 18:21:27
Problema Secv Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#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;
}