Cod sursa(job #3151045)

Utilizator SSKMFSS KMF SSKMF Data 19 septembrie 2023 16:14:56
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin ("secv.in");
ofstream cout ("secv.out");

int main ()
{
    int lungime , sir[5001];
    cin >> lungime >> sir[1];

    int optiuni[5001] = {1 , 1} , lungime_secventa[5001] = {0 , 1} , lungime_minima = 1;
    for (int indice = 2 ; indice <= lungime ; indice++)
    {
        cin >> sir[indice];

        if (sir[indice] > sir[optiuni[optiuni[0]]])
            { optiuni[++optiuni[0]] = indice; lungime_minima = lungime_secventa[indice] = indice - optiuni[optiuni[0] - 1] + lungime_secventa[optiuni[optiuni[0] - 1]]; }
        else
        {
            int stanga = 1 , dreapta = optiuni[0] , pozitie = 0;
            while (stanga <= dreapta)
            {
                const int mijloc = (stanga + dreapta) >> 1;
                if (sir[optiuni[mijloc]] >= sir[indice])
                    { dreapta = mijloc - 1; pozitie = mijloc; }
                else
                    stanga = mijloc + 1;
            }

            lungime_secventa[indice] = (pozitie == 1 ? 1 : indice - optiuni[pozitie - 1] + lungime_secventa[optiuni[pozitie - 1]]);
            optiuni[pozitie] = indice;

            if (pozitie == optiuni[0])
                lungime_minima = min(lungime_minima , lungime_secventa[indice]);
        }
    }

    sort(sir + 1 , sir + lungime + 1);

    int distincte = 0;
    for (int indice = 1 ; indice <= lungime ; indice++)
    {
        distincte++;
        while (indice < lungime && sir[indice + 1] == sir[indice])
            indice++;
    }

    cout << (distincte == optiuni[0] ? lungime_minima : -1);
    cout.close(); cin.close();
    return 0;
}