Pagini recente » Cod sursa (job #1815774) | Cod sursa (job #2123943) | Cod sursa (job #1929353) | Cod sursa (job #215397) | Cod sursa (job #1345686)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
FILE *fin = fopen( "scmax.in", "r" ), *fout = fopen( "scmax.out", "w" );
const int nmax = 100000;
int val[ nmax + 1 ];
vector <int> aux;
int n, d[ nmax + 1 ], aib[ nmax + 1 ], v[ nmax + 1 ], r[ nmax + 1 ];
void update( int pos, int x ) {
for( int i = pos; i <= n; i += (i & -i) ) {
if ( d[ aib[ i ] ] < d[ x ] ) {
aib[ i ] = x;
}
}
}
int query( int val ) {
int sol = 0;
for( int i = val; i > 0; i -= (i & -i) ) {
if ( d[ sol ] < d[ aib[ i ] ] ) {
sol = aib[ i ];
}
}
return sol;
}
void normalizare() {
sort( aux.begin(), aux.end() );
aux.resize( unique( aux.begin(), aux.end() ) - aux.begin() );
for( int i = 1; i <= n; ++ i ) {
v[ i ] = lower_bound( aux.begin(), aux.end(), val[ i ] ) - aux.begin() + 1;
}
}
int main() {
int ans;
fscanf( fin, "%d", &n );
ans = 0;
for( int i = 1; i <= n; ++ i ) {
fscanf( fin, "%d", &val[ i ] );
aux.push_back( val[ i ] );
}
normalizare();
for( int i = 1; i <= n; ++ i ) {
r[ i ] = query( v[ i ] - 1 );
d[ i ] = d[ r[ i ] ] + 1;
update( v[ i ], i );
if ( d[ i ] > d[ ans ] ) {
ans = i;
}
}
fprintf( fout, "%d\n", d[ ans ] );
aux.clear();
while ( ans ) {
aux.push_back( val[ ans ] );
ans = r[ ans ];
}
for( int i = ( int )aux.size() - 1; i >= 0; -- i ) {
fprintf( fout, "%d ", aux[ i ] );
}
fprintf( fout, "\n" );
fclose( fin );
fclose( fout );
return 0;
}