Pagini recente » Cod sursa (job #2290024) | Cod sursa (job #2487207) | Cod sursa (job #2187574) | Cod sursa (job #2955192) | Cod sursa (job #2340925)
#include <fstream>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int NMAX = 100002;
const int INF = 2000000000;
int N;
int a[NMAX];
int pre[NMAX];
int sub[NMAX];
int last;
void Read()
{
fin >> N;
for( int i = 1; i <= N; ++i )
fin >> a[i];
fin.close();
}
int BinSearch( int lf, int rg, int val )
{
if( lf > rg ) return 0;
int mid = ( lf + rg ) / 2;
if( val > a[ sub[mid] ] ) return max( mid, BinSearch( mid + 1, rg, val ) );
else return BinSearch( lf, mid - 1, val );
}
void Remake( int idx )
{
if( pre[idx] > 0 ) Remake( pre[idx] );
fout << a[idx] << ' ';
}
void Do()
{
a[0] = -INF;
a[N + 1] = INF;
sub[0] = 0;
last = 0;
for( int i = 1; i <= N; ++i )
{
if( a[i] > a[ sub[last] ] )
{
sub[ ++last ] = i;
pre[i] = sub[last - 1];
}
else
{
int pos = BinSearch( 1, last, a[i] );
pre[i] = sub[pos];
sub[pos + 1] = i;
}
}
fout << last << '\n';
Remake( sub[last] );
}
int main()
{
Read();
Do();
return 0;
}