Pagini recente » Cod sursa (job #1573667) | Cod sursa (job #952098) | Cod sursa (job #1578149) | Cod sursa (job #149235) | Cod sursa (job #1171708)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int nmax = 100000;
int p[ nmax + 1 ];
int a[ nmax + 1 ];
vector <int> v;
int main()
{
int n, n2, sol, k;
fin>>n;
v.push_back( 0 );
a[ 0 ] = 0;
for( int i = 1; i <= n; ++ i ) {
fin>>a[i];
k = (int)v.size();
for( n2 = 1; n2 * 2 <= k; n2 *= 2 ) {
}
sol = k - 1;
for( int step = n2; step > 0; step /= 2 ) {
if ( sol - step >= 0 && a[ v[ sol - step ] ] > a[i] ) {
sol -= step;
}
}
if ( a[i] > a[ v[ sol ] ] ) {
v.push_back( i );
p[i] = v[ k - 1 ];
} else {
v[ sol ] = i;
p[ i ] = v[ sol - 1 ];
}
}
fout<<v.size() - 1<<'\n';
k = v.back();
v.clear();
while( k > 0 ) {
v.push_back( k );
k = p[ k ];
}
for( int i = (int)v.size() - 1; i >= 0; -- i ) {
fout<<a[ v[i] ]<<' ';
}
fout<<'\n';
fin.close();
fout.close();
return 0;
}