Cod sursa(job #727176)
#include <fstream>
#define nmax 100004
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int T[nmax],P[nmax],V[nmax],L,N;
void Afiseaza(int p)
{
if(T[p])
Afiseaza(T[p]);
out<<V[p]<<' ';
}
inline int Cauta(int val)
{
int q,i;
for(i=0;i<=L;i++)
if(V[P[i]]<val)q=i;
return q;
}
int main()
{
int i,poz;
in>>N;
for(i=1;i<=N;i++)
in>>V[i];
//L = lungimea sibusirului crescator maximal
//P[i] = pozitia ultimului element din subsirul crescator de lungime i
P[L=1]=1;
for(i=2;i<=N;i++)
{
poz = Cauta(V[i]);
//out<<poz<<' ';
if(poz==L)
P[++L]=i;
else if(V[P[poz+1]]<V[i])//il micsorez pe urmatorul
P[poz+1]=i;
T[i]=P[poz];
}
out<<L<<'\n';
Afiseaza(P[L]);
return 0;
}