Pagini recente » Cod sursa (job #347187) | Cod sursa (job #560559) | Cod sursa (job #3229777) | Cod sursa (job #592310) | Cod sursa (job #1190701)
#include <stdio.h>
#define N_MAX 100000
int v[ N_MAX ], m[ N_MAX + 1 ], p[ N_MAX ], rez[ N_MAX ], ind = 0;
int caut ( int i, int maxl ){
int poz = 0, pas = 1 << 16;
while ( pas > 0 ){
if ( poz + pas <= maxl ){
if ( v[ m[ poz + pas ] ] < v[ i ] ){
poz += pas;
}
}
pas >>= 1;
}
return poz + 1;
}
int main()
{
FILE *in = fopen ( "scmax.in", "r" );
int n;
fscanf ( in, "%d", &n );
int i, maxl = 0, l;
for ( i = 0; i < n; i++ ){
fscanf ( in, "%d", &v[ i ] );
l = caut ( i, maxl );
if ( l > maxl ){
m[ l ] = i;
p[ i ] = m[ l - 1 ];
maxl = l;
}
else if ( v[ i ] < v[ m [ l ] ] ){
m [ l ] = i;
p [ i ] = m[ l - 1 ];
}
}
fclose ( in );
FILE *out = fopen ( "scmax.out", "w" );
fprintf ( out, "%d\n", maxl );
int poz = m[ maxl ];
while ( poz > 0 ){
rez[ ind ] = v[ poz ];
ind++;
poz = p[ poz ];
}
for ( i = ind - 1; i >= 0; i-- ){
fprintf ( out, "%d ", rez[ i ] );
}
fclose ( out );
return 0;
}