Pagini recente » Cod sursa (job #1053016) | Cod sursa (job #2678687) | Cod sursa (job #2763715) | Cod sursa (job #2602677) | Cod sursa (job #2660309)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int NMAX = 100005;
int N;
int lis[NMAX];
int lgmax;
int a[NMAX];
int pre[NMAX];
void Read()
{
fin >> N;
for( int i = 1; i <= N; ++i )
fin >> a[i];
}
int LowBound( int lf, int rg, int val ) {
if( lf > rg ) return 0;
int mid = lf + ( rg - lf ) / 2;
if( a[lis[mid]] < val ) return max( mid, LowBound( mid + 1, rg, val ) );
else return LowBound( lf, mid - 1, val );
}
void Remake( int pos ) {
if( pos == 0 ) return;
Remake( pre[pos] );
fout << a[pos] << ' ';
}
void Do()
{
for( int i = 1; i <= N; ++i ) {
int p;
if( lgmax == 0 ) p = 0;
else p = LowBound( 1, lgmax, a[i] );
pre[i] = lis[p];
lis[p + 1] = i;
if( p == lgmax ) ++lgmax;
}
//for( int i = 1; i <= lgmax; ++i )
// fout << a[lis[i]] << ' ';
fout << lgmax << '\n';
Remake( lis[lgmax] );
}
int main()
{
Read();
Do();
return 0;
}