Pagini recente » Cod sursa (job #2348913) | Cod sursa (job #1130066) | Cod sursa (job #1745917) | Cod sursa (job #1401044) | Cod sursa (job #2072637)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define lim 100010
#define inf 2e9
int ini[lim], dp[lim], dad[lim], n, rez, lmax;
/// returneaza cea mai din dreapta pozitie cu valoarea < val
int b_s (int val)
{
int mask, pos;
for (mask=1; mask<=lmax; mask<<=1);
for (pos=0; mask; mask>>=1)
if (pos+mask<=lmax && ini[dp[pos+mask]]<val)
pos+=mask;
return pos;
}
void drum (int nod)
{
if (dad[nod]) drum (dad[nod]);
fout<<ini[nod]<<' ';
}
int main()
{
fin>>n;
for (int i=1; i<=n; i++)
fin>>ini[i];
ini[0]=inf;
for (int i=1; i<=n; i++)
{
int pos = b_s (ini[i]);
lmax = max (lmax, pos+1);
dp[pos+1]=i;
dad[i] = dp[pos];
}
fout<<lmax<<'\n';
drum(dp[lmax]);
fout.close();
return 0;
}