Cod sursa(job #489104)

Utilizator iraIrina Stanescu ira Data 1 octombrie 2010 00:04:53
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>

#define NMAX 100000

#define infile "scmax.in"
#define outfile "scmax.out"


int s[NMAX], n, vals[NMAX], ll, tata[NMAX];
FILE *f;

void read_data() {
	FILE *fis = fopen(infile, "r");

	int i;
	fscanf(fis, "%d", &n);

	for (i = 0; i < n; i++)
		fscanf(fis, "%d", &s[i]);

	fclose(fis);

}

//returns a position
int binary_search(int nr) {

	int left, right, m;
	
	left = 0;
	right = ll;

	while (left <= right) {
		m = (right + left) / 2;

		//if (vals[m] <= nr)
		if (s[vals[m]] < nr)
			left = m  + 1;
		else
			right = m - 1;
	}


	return left;
}

void write_data(int k) {
	if (tata[k] == -1) {
		fprintf(f, "%d ", s[k]);
		return;
	}
	write_data(tata[k]);
	fprintf(f, "%d ", s[k]);
}



int main() {
	int i, pos;
	read_data();

	vals[0] = 0;
	tata[0] = -1;
	ll = 0;		

	for (i = 1; i < n; i++) {
		pos = binary_search(s[i]);
		if (pos == 0)
			tata[i] = -1;
		else 
			tata[i] = vals[pos - 1];

		if (pos == ll + 1) {
			ll++;
			vals[ll] = i;
		} else {
			vals[pos] = i;
		}
	}

	
	
	f = fopen(outfile, "w");
	fprintf(f, "%d\n", ll+1);
	write_data(vals[ll]);
	fprintf(f, "\n");
	fclose(f);
	return 0;
}