Pagini recente » Borderou de evaluare (job #2530176) | Cod sursa (job #2297927)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
#define nmax 100005
int n, m, logn, maxi, i, v[ nmax ], sub[ nmax ], poz[ nmax ], p, ln, k;
void tipar( int i )
{
if ( i != 0 && k != 0 )
{
if ( poz[ i ] == k )
{
k--;
tipar( i - 1 );
fout<< v[ i ] << ' ';
}
else
{
tipar( i - 1 );
}
}
}
int caut_bin( int val )
{
int i;
if ( logn < m )
logn <<= 1;
for ( i = m, ln = logn; ln; ln >>= 1 )
{
if ( i - ln > 0 && val <= sub[ i - ln ] )
i -= ln;
}
return i;
}
int main()
{
fin >> n;
m = 1;
logn = 1;
maxi = 1;
for ( i = 1; i <= n; i++ )
{
fin >> v[ i ];
sub[ i ] = ( ( 1 << 30 ) - 1 ) * 2;
p = caut_bin( v[ i ] );
if ( v[ i ] < sub[ p ] )
{
sub[ p ] = v[ i ];
poz[ i ] = p;
}
else if ( v[ i ] > sub[ p ] )
{
m++;
sub[ p + 1 ] = v[ i ];
poz[ i ] = p + 1;
maxi = i;
}
}
k = poz[ maxi ];
fout<< k << '\n';
tipar( maxi );
return 0;
}