Pagini recente » Cod sursa (job #3135257) | Cod sursa (job #2734327) | Cod sursa (job #1399665) | Cod sursa (job #2041300) | Cod sursa (job #2530981)
#include <fstream>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int NMAX = 100005;
int N;
int a[NMAX];
int lg[NMAX];
int l[NMAX], nrl;
int pre[NMAX];
void Read()
{
fin >> N;
for( int i = 1; i <= N; ++i )
fin >> a[i];
}
int LB( int lf, int rg, int val )
{
if(lf > rg )
return -1;
int m=(lf + rg)/2;
if( a[l[m]] < val )
return max( m, LB(m+1, rg, val));
else
return LB(lf, m-1, val);
}
void Remake( int idx ) {
if( idx == 0 ) return;
Remake( pre[idx] );
fout << a[idx] << ' ';
}
void Do()
{
for( int i = 1; i <= N; ++i )
{
if( nrl == 0 || a[i] < a[ l[1] ] )
{
l[1] = i;
if( nrl == 0 ) ++nrl;
continue;
}
int p = LB( 1, nrl, a[i] );
pre[i] = l[p];
l[p + 1] = i;
if( p == nrl ) ++nrl;
}
fout << nrl << '\n';
Remake( l[nrl] );
}
int main()
{
Read();
Do();
return 0;
}