Pagini recente » Cod sursa (job #2699528) | Cod sursa (job #371700) | Cod sursa (job #1752140) | Cod sursa (job #2247421)
#include <cstdio>
#include <iostream>
using namespace std;
#define NMAX 100005
int A[ NMAX ], D[ NMAX ], P[ NMAX ], ST[ NMAX ];
void sir( int i ) {
if ( P[ i ] != 0 ) {
sir( P[ i ] );
}
printf( "%d ", A[ i ] );
}
int cauta ( int n, int k ) {
int i = 0, pas = 1 << 17;
while ( pas ) {
if ( i + pas <= n && A[ ST[ i + pas ] ] < k )
i += pas;
pas /= 2;
}
return i;
}
int main () {
freopen( "scmax.in", "r" , stdin );
freopen( "scmax.out", "w", stdout );
int n, i, j, m, k, ma;
ma = m = 0;
scanf( "%d", &n );
for ( i = 1; i <= n; ++i ) {
scanf( "%d", &A[ i ] );
D[ i ] = 1;
}
for ( i = 1; i <= n; ++i ) {
k = cauta( m, A[ i ] );
D[ i ] = k + 1;
P[ i ] = ST[ k ];
ST[ k + 1 ] = i;
if ( k + 1 > m ) m = k + 1;
ma = max( ma, D[ i ] );
}
printf( "%d\n", ma );
for ( i = n; i >= 1; --i ) {
if ( D[ i ] == ma ) {
sir( i );
i = 0;
}
}
return 0;
}