Cod sursa(job #1075079)

Utilizator danny794Dan Danaila danny794 Data 8 ianuarie 2014 16:40:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>

using namespace std;

const int MAXN = 100005;

int N, Nm;
int values[MAXN], min[MAXN], prev[MAXN], solution[MAXN];

void read() {
	freopen( "scmax.in", "r", stdin );
	freopen( "scmax.out", "w", stdout );
	scanf("%i", &N);
	for(int i = 1; i <= N; i++)
		scanf("%i", &values[i]);
}

int binarySearch(int left, int right, int value) {

	int m;
	while( left <= right ) {
		m = (left + right) >> 1;
		if ( values[min[m]] < value )
			left = m + 1;
		else
			right = m - 1;
	}

	return left;
}

void solve() {
	int index;

	for(int i = 1; i <= N; i++) {
		index = binarySearch(1, Nm, values[i]);
		if( index == Nm + 1 ) {
			min[index] = i;
			prev[i] = min[Nm];
			Nm++;
		} else
		if( values[min[index]] > values[i] ) {
			if ( values[prev[min[index]]] < values[i] ) {
				prev[i] = prev[min[index]];
				min[index] = i;
			} else if ( values[min[index - 1]] < values[i] ) {
				prev[i] = min[index - 1];
				min[index] = i;
			}

		} else {
			prev[i] = 0;
		}
	}
}

void printSolution() {
	int index = min[Nm];
	int i = Nm;

	while( index ) {
		solution[i--] = values[index];
		index = prev[index];
	}
	printf("%i\n", Nm);
	for(int i = 1; i <= Nm; i++)
		printf("%i ", solution[i]);
}

int main() {
	read();
	solve();
	printSolution();
	return 0;
}