Pagini recente » Cod sursa (job #1313827) | Cod sursa (job #1197327) | Cod sursa (job #218173) | Cod sursa (job #1959368) | Cod sursa (job #3139116)
#include <fstream>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int sir[100001] , tata[100001] , pozitii[100001] , optiuni[100001];
void Afisare (const int indice)
{
if (tata[indice])
Afisare(tata[indice]);
cout << sir[indice] << ' ';
}
int main ()
{
int lungime;
cin >> lungime;
int lungime_optiuni = 0;
for (int indice = 1 ; indice <= lungime ; indice++)
{
cin >> sir[indice];
if (sir[indice] > optiuni[lungime_optiuni]) {
optiuni[++lungime_optiuni] = sir[indice];
pozitii[lungime_optiuni] = indice;
tata[indice] = pozitii[lungime_optiuni - 1];
}
else
{
int putere = 1;
while ((putere << 1) <= lungime_optiuni)
putere <<= 1;
int pozitie = 1;
while (putere)
{
if (pozitie + putere <= lungime_optiuni && optiuni[pozitie + putere] <= sir[indice])
pozitie += putere;
putere >>= 1;
}
tata[indice] = pozitii[pozitie - 1];
optiuni[pozitie] = sir[indice];
pozitii[pozitie] = indice;
}
}
cout << lungime_optiuni << '\n';
Afisare(pozitii[lungime_optiuni]);
cout.close(); cin.close();
return 0;
}