Cod sursa(job #218581)

Utilizator plastikDan George Filimon plastik Data 2 noiembrie 2008 18:04:25
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
// http://infoarena.ro/problema/scmax

#include <cstdio>

const int NMAX = 100000;

int A[NMAX], n;
int Pred[NMAX], Ind[NMAX], lMax;

int binarySearch(int key) {
	int l = 0, r = lMax - 1, m;
	while (l <= r) {
		m = (r - l) / 2 + l;
		if (key == A[Ind[m]])
			return m;
		
		if (key < A[Ind[m]])
			r = m - 1;
		else
			l = m + 1;
	}
	return m;
}

void printSol(int i) {
	if (i == -1)
		return;
	
	printSol(Pred[i]);
	
	printf("%d ", A[i]);
}

int main() {
	
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	
	scanf("%d", &n);
	int i;
	for (i = 0; i < n; ++ i) {
		scanf("%d", &A[i]);
		Pred[i] = -1;
	}
	Ind[0] = 0;
	
	int ind;
	for (i = 1, lMax = 1; i < n; ++ i) {
		ind = binarySearch(A[i]);
		if (ind == lMax - 1 && A[i] > A[Ind[ind]]) {
			Pred[i] = Ind[ind];
			
			Ind[lMax] = i;
			++ lMax;
		} else {
			if (ind == 0)
				Pred[i] = -1;
			else
				Pred[i] = Ind[ind - 1];
			Ind[ind] = i;
		}
	}
	
	printf("%d\n", lMax);
	printSol(Ind[lMax - 1]);
		
	return 0;
}