Pagini recente » Arhiva de probleme | Cod sursa (job #2960285) | Cod sursa (job #2476705) | Cod sursa (job #2040454) | Cod sursa (job #1921350)
#include <cstdio>
using namespace std;
#define NMAX 100001
int D[ NMAX ];
int V[ NMAX ];
int Id[ NMAX ];
int Tata[ NMAX ];
int cauta ( int k, int n ) {
int i = 0;
int pas = 1 << 17;
while ( pas ) {
if ( i + pas <= n && V[ Id[ i + pas ] ] < k )
i += pas;
pas /= 2;
}
return i;
}
void recon ( int nod ) {
if ( nod == 0 ) {
return ;
}
recon( Tata[ nod ] );
printf( "%d ", V[ nod ] );
}
int main () {
freopen( "scmax.in", "r", stdin );
freopen( "scmax.out", "w", stdout );
int n, m, i, j, x, y, c, k;
x = 0;
scanf( "%d",&n );
m = 0;
scanf( "%d",&V[ 1 ] );
Id[ 1 ] = D[ 1 ] = k = 1;
for ( i = 2; i <= n; ++i ) {
scanf( "%d",&V[ i ] );
x = cauta ( V[ i ], m );
D[ i ] = x + 1;
if ( D[ k ] < D[ i ] ) k = i;
Id[ x + 1 ] = i;
Tata[ i ] = Id[ x ];
if ( x + 1 > m ) m++;
}
printf( "%d\n",D[ k ] );
recon( k );
return 0;
}