Cod sursa(job #845191)
#include <fstream>
using namespace std;
const int Nmax = 100010;
ifstream F("scmax.in");
ofstream G("scmax.out");
int N,k,L[Nmax],S[Nmax],V[Nmax],Sol=0;
int GetPos(int X)
{
int P=0, U=Sol, M, R=1;
while (P<=U)
{
M=(P+U)/2;
if (X>S[M])
P=M+1, R=M;
else
U=M-1;
}
return R+1;
}
int main ()
{
F>>N;
for (int i=1,a;i<=N;++i)
{
F>>a;
int j=GetPos(a);
L[i]=j;
S[j]=a;
if ( j>Sol ) Sol=j, k=i;
V[i]=a;
}
G<<Sol<<'\n';
while ( k>0 )
{
S[++S[0]]=V[k];
for (int i=k;i>=0;--i)
if (L[i]+1==L[k])
{
k=i;
break;
}
}
for (int i=S[0];i>0;--i)
G<<S[i]<<' ';
G<<'\n';
}