Cod sursa(job #823603)

Utilizator vegittogfmEnciu Cristian vegittogfm Data 25 noiembrie 2012 12:49:53
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<malloc.h>

int cauta(int x, int* vect, int n)
{
	int st = 0, dr = n, mid;
	while(1){
		mid = (st + dr) / 2;
		if(x < vect[mid]){
			if( st == dr ){
				return st;
			}
			dr = mid;
		}
		else if(x > vect[mid]){
			if ( st == dr ){
				return n+1;
			}
			st = (st + dr + 1) / 2;
		}
		else
			return mid;
	}
}

int main(int argc, char* argv[])
{
	int nrel, *el, *lung, *test, i, max = 0, poz;
	FILE *f = fopen("scmax.in", "r");
	FILE *g = fopen("scmax.out", "w");
	fscanf(f, "%d", &nrel);
	el = (int*)malloc(nrel * sizeof(int));
	lung = (int*)malloc(nrel * sizeof(int));
	test = (int*)malloc(nrel * sizeof(int));
	
	fscanf(f, "%d", &el[0]);
	test[0] = el[0];
	lung[0] = 0;
	max = 0;
	
	for(i = 1 ; i < nrel ; ++i){
		fscanf(f, "%d", &el[i]);
		poz = cauta(el[i], test, max);
		test[poz] = el[i];
		lung[i] = poz;
		if ( max < poz ){
			max = poz;
		}
	}
	
	fprintf(g, "%d\n", max+1);
	for(nrel = 0 ; lung[nrel] != max ; ++nrel);
	poz = max;
	for(i = nrel ; poz >= 0 ; --i){
		if( lung[i] == poz ){
			test[poz] = el[i];
			--poz;
		}
	}
	
	for(i = 0 ; i <= max ; ++i){
		fprintf(g, "%d ", test[i]);
	}
	
	free(el);
	free(lung);
	free(test);
	
	fclose(f);
	fclose(g);
	
	return 0;
}