Pagini recente » Cod sursa (job #2771070) | Cod sursa (job #739915) | Cod sursa (job #2114837) | Cod sursa (job #1013974) | Cod sursa (job #1912770)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define lim 100010
int n,ini[lim],dp[lim],dad[lim],lmax;
/// caut cel mai din dreapta indice cu valoarea < val
int b_s(int val)
{
int pos,mask;
for(mask=1; mask<=lmax; mask<<=1);
pos=0;
for(; mask; mask>>=1)
if(pos+mask<=lmax)
if(ini[dp[pos+mask]]<val)
pos+=mask;
return pos;
}
void drum(int k)
{
if(dad[k]) drum(dad[k]);
fout<<ini[k]<<' ';
}
int main()
{
int pos;
fin>>n;
for(int i=1; i<=n; i++)
fin>>ini[i];
ini[0]=(1<<30);
for(int i=1; i<=n; i++)
{
pos=b_s(ini[i]);
lmax=max(lmax,pos+1);
dp[pos+1]=i;
dad[i]=dp[pos];
}
fout<<lmax<<'\n';
drum(dp[lmax]);
fin.close();
fout.close();
return 0;
}