Pagini recente » Cod sursa (job #245133) | Cod sursa (job #2548587) | Cod sursa (job #775130) | Cod sursa (job #1816406) | Cod sursa (job #1190709)
#include <stdio.h>
#define N_MAX 100000
int v[ N_MAX + 1 ], m[ N_MAX + 1 ], p[ N_MAX + 1 ], rez[ N_MAX + 1 ], ind = 1;
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;
m[ 0 ] = 0;
for ( i = 1; 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;
}