Cod sursa(job #2177648)

Utilizator ancabdBadiu Anca ancabd Data 18 martie 2018 18:53:27
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("secv.in");
ofstream fout ("secv.out");

#define MAX 5001
#define INF 0x3f3f3f

int n, a[MAX], asort[MAX], b[MAX], ind, lst[MAX], frst[MAX], lmin = INF;

int BinarySearch(int x)
{
    int st = 1, dr = ind, mijl;
    while (st <= dr)
    {
        mijl = (st + dr)/2;
        if (x == b[mijl])return mijl;
        else if (x > b[mijl])st = mijl + 1;
        else dr = mijl - 1;
    }
    return mijl;
}
int main()
{
    fin >> n;
    for (int i = 1; i <= n; i ++)
    {
        fin >> a[i];
        asort[i] = a[i];
    }
    sort(asort + 1, asort + 1 + n);

    asort[0] = -1;
    for (int i = 1; i <= n; i ++)
        if (asort[i] != asort[i - 1])
            b[++ind] = asort[i];

    for (int i = 1; i <= n; i ++)
        frst[i] = lst[i] = -1;

    for (int i = 1; i <= n; i ++)
    {
        if (a[i] == b[1])frst[i] = i, lst[1] = i;
        else
        {
            int poz = BinarySearch(a[i]);
            if (lst[poz - 1] != -1)
            {
                lst[poz] = i;
                frst[i] = frst[lst[poz - 1]];
                if (poz == ind) lmin = min(lmin, i - frst[i] + 1);
            }
            else frst[i] = -1;
        }
    }
    if (lmin == INF)lmin = -1;
    fout << lmin;
    return 0;
}