Pagini recente » Cod sursa (job #301406) | Cod sursa (job #2294952) | Cod sursa (job #2092486) | Cod sursa (job #226256) | Cod sursa (job #1836416)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N = 1 + 100000;
int N;
int a[MAX_N];
int indice[MAX_N];
int indice_anterior[MAX_N];
int solutie[MAX_N];
int lungime;
void read_input()
{
fin >> N;
for(int i = 1; i <= N; i++)
fin >> a[i];
}
int cauta_binar(int i)
{
int stanga = 1, dreapta = lungime, solutie = 0;
while(stanga <= dreapta) {
int mijloc = (stanga + dreapta) / 2;
if(a[i] > a[indice[mijloc]])
{
solutie = mijloc;
stanga = mijloc + 1;
}
else
dreapta = mijloc - 1;
}
return solutie + 1;
}
void construieste_dinamica() {
indice[1] = 1; lungime = 1;
for(int i = 2; i <= N; i++) {
if(a[i] > a[indice[lungime]])
{
++lungime;
indice[lungime] = i;
indice_anterior[i] = indice[lungime - 1];
}
else
{
int pozitie = cauta_binar(i);
indice[pozitie] = i;
indice_anterior[i] = indice[pozitie - 1];
}
}
}
void obtine_solutia()
{
int pozitie = lungime, i = indice[lungime];
while(i > 0)
{
solutie[pozitie] = a[i];
i = indice_anterior[i];
pozitie --;
}
}
void afiseaza_solutia()
{
fout << lungime << '\n';
for(int i = 1; i <= lungime; i++)
fout << solutie[i] << " ";
}
int main()
{
read_input();
construieste_dinamica();
obtine_solutia();
afiseaza_solutia();
return 0;
}