Pagini recente » Cod sursa (job #398661) | Cod sursa (job #2923277) | Cod sursa (job #2821424) | Cod sursa (job #2645607) | Cod sursa (job #1612109)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[100001], sol[100001], N, L = 0;
int indici[100001];
int link[100001];
int afisare[100001];
int compare(int i)
{
int y = 0;
/*for (int j = 1; j <= L; j++)
if (sol[j] < v[i])
y = j;*/
int pas=1<<30;
while(pas){
if(y+pas <= L && sol[y+pas] < v[i]) y+=pas; //y|=pas;
pas>>=1;
}
return y+1;
}
int main()
{
in >> N;
for (int i = 1; i <= N; i++)
in >> v[i];
for (int i = 1; i <= N; i++){
int unde = compare(i);
if(unde > L) L++;
sol[unde]=v[i];
indici[unde]=i;
link[i]=indici[unde-1];
}
out<<L<<'\n';
int poz=indici[L];
for(int i=L;i>=1;i--){
afisare[i] = v[poz];
poz=link[poz];
}
for(int i=1;i<=L;i++) out<<afisare[i]<<' ';
out<<'\n';
return 0;
}