Cod sursa(job #823704)

Utilizator dya_ndmNanuti Diana-Maria dya_ndm Data 25 noiembrie 2012 16:09:59
Problema Subsir crescator maximal Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <stdlib.h>

int binary_search(int elem, int left, int right, int v[]){
	int mid;
	while(left <= right){
		mid = (left + right) / 2;
		if (v[mid] == elem)
			return mid;
		else
			{
			if(v[mid] < elem)
				left = mid + 1;
			else
				right = mid - 1;
			}
	}
	return left;
}
/*
int main(int argc, char *argv[]){
	FILE *in = fopen(argv[1], "r");
	FILE *out = fopen(argv[2], "w");
	*/
int main()
{ freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);

	int n;
	//fscanf(in, "%d", &n);
	scanf("%d", &n);
	int *price, *positions;
	price = (int*) calloc(n, sizeof(int));
	positions = (int*) malloc(n * sizeof(int));
	
	int kiki[100001]; //!!!!
	int i, j, aux, length, lmax, pos;
	length = lmax = pos = j = 0;
	for(i = 0; i < n; ++i){
		//fscanf(in, "%d", &aux);
		scanf("%d", &aux);
		kiki[i] = aux;
		pos = binary_search(aux, 0, length, price);
		if(price[pos] == 0)
			++length;
		price[pos] = aux;
		positions[j++] = pos;
		if(pos > lmax)
			lmax = pos;
	}
	
		
	int *result;
	j = 0;
	aux = lmax;
	result = (int *) malloc(lmax);
	for(i = n-1; i >= 0 && j < lmax; --i){
		if(positions[i] == aux)
			result[--aux] = i+1;			
	}
	
	//!!!!!!!!!!!
	printf("%d\n", lmax);
	
	for(i = 0; i < lmax; ++i)
		//fprintf(out, "%d ", result[i]);
	//fprintf(out, "\n");
		printf("%d ", kiki[result[i] - 1]);
	printf("\n");
	free(price);
	free(positions);
	free(result);
	
	//fclose(in);
	//fclose(out);
	return 0;
}