Cod sursa(job #489168)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 1 octombrie 2010 16:06:58
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>
#define dim 100100

FILE*f=fopen("scmax.in","r");
FILE*g=fopen("scmax.out","w");

int N,W[dim],i,poz,M[dim],m,p,u,T[dim],sol[dim],k;

int main () {
	
	fscanf(f,"%d",&N);
	for ( i = 1 ; i <= N ; ++i )
		fscanf(f,"%d",&W[i]);
	
	M[ 1 ] = M[ 0 ] = 1;
	
	for ( i = 2 ; i <= N ; ++i ){
		
		p = 1 ; u = M[ 0 ] ;
		
		while ( p <= u ){
			m = p + (u - p) / 2;
			if ( W[i] > W[ M[ m ] ] )
				p = m + 1 ;
			else
				u = m - 1 ;
			
		}
		
		poz = p;
		M[poz] = i;
		if ( poz > M[0] )
			M[0] = poz;
		T[i] = M[u];
		
	}
	
	fprintf(g,"%d\n",M[0]);
	u = M[M[0]];
	while( T[u] != 0 ){
		
		sol[ ++k ] = W[ u ] ;
		
		u = T[u];
		
	}
	
	for ( i = k ; i >= 1 ; --i )
		fprintf(g,"%d ",sol[i]);
	
	fclose(f);
	fclose(g);
	
	return 0;
}