Pagini recente » Cod sursa (job #3158020) | Cod sursa (job #2933558) | Cod sursa (job #2232148) | Cod sursa (job #743367) | Cod sursa (job #3151045)
#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;
}