Cod sursa(job #823339)

Utilizator v_vero_93Velciu Veronica Mihaela v_vero_93 Data 24 noiembrie 2012 21:42:32
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.45 kb
/*
 * cadouri.c
 *
 *  Created on: Nov 15, 2012
 *      Author: Veronica-Mihaela Velciu
 */


#include<stdio.h>
#include<stdlib.h>

void read_data ( int *v, int n, FILE* fp){
	int i;

	for( i=1; i<=n; i++)
		fscanf(fp,"%d", &v[i]);
}

int get_subsequence( int *v, int n, int *sub ) {
	int M[100], P[100], L=1, i,j;
	v[0]=-1;
	M[0]=0;M[1]=1;
	for( i=2; i<=n; i++ ) {
		j = binary_search(v, M, 0, L, i);
		P[i]=M[j];
		M[j+1] = i;
		if( L<j+1 )
			L=j+1;
	}


	int last = M[L];
	i=L;
	while( i>0 ) {
		sub[i]=last;
		last=P[last];
		i--;
	}
	return L;
}

int binary_search( int *v, int* M, int start, int end, int i) {
	int mij = (start+end)/2;

	while(start<end) {
		if ( v[M[mij]] < v[i] &&  v[M[mij+1]] >= v[i] )
			return mij;
		if( v[M[mij+1]] < v[i] )
			{ start=mij+1; mij = (start+end)/2;}
		else
			{ end=mij-1; mij = (start+end)/2;}
	}
	return end;
}

void write_data ( int *v, int n, char* out_file ){
	int i;
	FILE * fp;

	fp = fopen(out_file,"w");

	for( i=1; i<=n; i++ )
		fprintf( fp, "%d ", v[i]);

	fclose(fp);
}

int main() {

	//if( argc == 3 ) {
		int n, *P, *sub, L;

		FILE *fp;
		fp = fopen("scmax.in","r");

		fscanf(fp,"%d", &n);
		P = malloc( (n+1)*sizeof(int) );
		sub = malloc( (n+1)*sizeof(int) );

		read_data( P, n, fp );

		fclose(fp);


		L = get_subsequence( P, n, sub );

		write_data( sub, L, "scmax.out" );

		free(P);
		free(sub);


		return 0;
	//}
	//else {
	//	fprintf( stderr, "Usage: ./main input_file output_file\n");
	//	return -1;
	//}
}