Cod sursa(job #177103)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 12 aprilie 2008 12:24:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100001
#define FIN "scmax.in"
#define FOUT "scmax.out"
#define INFINIT 2000000001

int N, A[NMAX], V[NMAX], ST[NMAX], L;
FILE * fin, * fout;

int binary_search( int value )
{
	int step = 1, i = 0;
	while( step <= L ) step <<= 1;
    while ( step )
    {
    	if (i + step <= L && V[i+step] < value  ) i += step;
    	step >>= 1;
    }
    i++;
    if( i > L ) L++;
    return i;
}

void Reconst( int i, int last, int L )
{
	if( L )
	{
		if( ST[i] == L && A[i] < last ) 
		{
			Reconst( i - 1, A[i], L - 1);
			fprintf( fout, "%d ", A[i]);
		}
		else
			Reconst( i - 1, last, L );
	}
	
}

int main()
{
	int i;
	fin = fopen( FIN, "r" );
	fout = fopen( FOUT, "w" );
	fscanf( fin, "%d", &N );
	for( i = 1; i <= N; i++ )
		fscanf( fin, "%d", A+i );
	L = 1; V[1] = A[1]; ST[1] = 1;
	for( i = 2; i <= N; i++ )
	{
		int t = binary_search( A[i] );
		V[t] = A[i];
		ST[i] = t;
	}
	fprintf( fout, "%d\n", L );
	int last = INFINIT;
    Reconst( N, last, L );
	
	fprintf( fout, "\n" );
	fclose( fin );
	fclose( fout );
	return 0;
		
}