Pagini recente » Cod sursa (job #1640886) | Cod sursa (job #2548804) | Cod sursa (job #1994039) | Cod sursa (job #1882592) | Cod sursa (job #1836427)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in")
ofstream fout("scmax.out")
const int MAX_N = 1 + 100000;
int N, a[MAX_N], indice[MAX_N], indice_anterior[MAX_N], solutie[MAX_N];
int lungime;
void read_imput()
{
fin>>N;
for(int i = 1;i <= N;i++)
fin>>a[i];
}
int cauta_binar(int i)
{int stanga = 1, dreapta = N, sol = 0;
while (stanga <= dreapta)
{int mijloc = (stanga + dreapta)/2;
if(a[i] > a[indice[mijloc]])
{
solutie = mijloc;
stanga = n / 2 + 1
}
else dreapta = n / 2 - 1;
}
return solutie + 1;
}
void connstruieste_dinamica()
{indice[1] = 1; lungim = 1;
if(a[i] > a[indice[lungime]])
{lungime++;
idice[lugime] = i;
}indice_anterior[i]= indice[lungime - 1];
else
{
int pozitie = cauta_binar(i);
idice[pozitie] = i;
indice_anterior(i) = indice[pozitie - 1];
}
}
void obtine_solutie()
{
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_imput()
construieste_dinamica()
obtine_solutie()
afiseaza_solutia()
return 0;
}