Pagini recente » Cod sursa (job #255058) | Cod sursa (job #2004274) | Cod sursa (job #1996249) | Cod sursa (job #194745) | Cod sursa (job #1783347)
#include <stdio.h>
int v[100000], lung[100000], poz[100000];
char frecv[100000];
int cautbin( int nr, int start, int stop ){
int pivot=0;
while( start<=stop ){
pivot = ( start + stop ) / 2;
if( lung[pivot]==nr )
return pivot;
else if( lung[pivot] > nr )
stop = pivot - 1;
else if( lung[pivot] < nr )
start = pivot + 1;
}
return pivot;
}
int main()
{
int n, i, pozi, poza;
FILE *fin, *fout;
fin = fopen( "scmax.in", "r" );
fscanf( fin, "%d", &n);
poza = -1;
for( i=0; i<n; i++ ){
fscanf( fin, "%d", &v[i] );
pozi = cautbin( v[i], 0, poza ); ///cautam pozitia cea mai mica, mai mare decat elementul curent
while( pozi<=poza && lung[pozi] < v[i] )
pozi++;
lung[pozi] = v[i]; ///retineme pe ce pozitie in vectorul pt lungime am pus variabila pt a putea
poz[i] = pozi; ///reconstruii subsirul de lungime maximala
if( pozi>poza )
poza = pozi; ///lungimea vectorului lung[0/1][i] e chiar lungimea subsirului maximal
}
fclose( fin );
fout = fopen( "scmax.out", "w" );
fprintf( fout, "%d\n", poza+1 );
pozi = poza;
for( i=n-1; i>=0; i-- ){
if( poz[i]==pozi ){
frecv[i] = 1;
pozi--;
}
}
for( i=0; i<=n; i++ )
if( frecv[i]==1 )
fprintf( fout, "%d ", v[i] );
fputc( '\n', fout );
fclose( fout );
return 0;
}