Cod sursa(job #369271)

Utilizator Addy.Adrian Draghici Addy. Data 27 noiembrie 2009 19:00:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
#define Nmax 100003

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

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

void print_sol(int poz) {
	if (poz) {
		print_sol(T[poz]);
		fprintf(g, "%d ", v[poz]);
	}
}

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;
		T[i] = X[p-1];
	}
	
	fprintf(g, "%d\n", sol);
	print_sol(X[sol]);
	
	fclose(f); fclose(g);
	
	return 0;
}