Cod sursa(job #369270)

Utilizator Addy.Adrian Draghici Addy. Data 27 noiembrie 2009 18:56:13
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>
#define Nmax 100003

int v[Nmax], X[Nmax];
int n, i, p, u, mid, sol;

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

void print_sol(int i) {
	if (i > 0) {
		print_sol(i-1);
		fprintf(g, "%d ", v[X[i]]);
	}
}

int main() {

	fscanf(f, "%d", &n);
	for (i = 1; i <= n; i++)
		fscanf(f, "%d", &v[i]);
	
	X[1] = 1, sol = 1;
	for (i = 2; i <= n; i++) {
		p = 1, u = sol;
		while (p <= u) {
			mid = (u - p) / 2 + p;
			if (v[i] > v[X[mid]])
				p = mid + 1;
			else
				u = mid - 1;
		}
		
		//dupa cautarea binara, p ramane fie pe prima valoare mai mare decat cea cautata, fie pe sol + 1 (daca nu gasesc)
		if (p > sol) //daca p > sol, inseamna ca p == sol + 1
			sol++;
		X[p] = i;
	}
	
	fprintf(g, "%d\n", sol);
	print_sol(sol);
	
	fclose(f); fclose(g);
	
	return 0;
}