Cod sursa(job #483263)

Utilizator elmercerAlex Mercer elmercer Data 7 septembrie 2010 18:19:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <math.h>

long n, v[100010], a[100010], last[100010], din[100010], dex[100010], val, i, max;

long BSearch (long num) {
	long ll = 0, rl = dex[0], sol = 0;
	
	while (ll < rl) {
		long mid = (ll + rl) / 2 + 1;
		if (a[dex[mid]] >= num) {
			rl = mid - 1;
		} else {
			ll = mid;
			sol = mid;
		}
	}
	
	return sol;
}

int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	
	scanf("%ld", &n);
	din[0] = 1;
	din[1] = 1;
	a[0] = 2000000010;
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &a[i]);
		if (i == 1) {
			dex[ 0 ] = 1;
			dex[1] = i;
			last[ 1 ] = 0;
			continue;
		}
		
		din[i] = BSearch(a[i]) + 1;
		if (dex[din[i]] == 0) ++dex[0]; 
		
		dex[din[i]] = i;
		
		last[i] = dex[din[i] - 1];							
		if( din[ i ] == 1) last[ i ] = 0;
		
	}
	
	printf("%ld\n", dex[0]);
	
	long co = dex[dex[0]];
	
	do {
		v[++v[0]] = a[co];
		co = last[co];
	} while (co != 0);
	
	for (i = v[0]; i >= 1; --i) {
		printf("%ld ", v[i]);
	}
	
	/*for (i = 2; i <= dex[0]; ++i) {
		printf("%ld ", a[last[i]]);
	}*/
	
	//printf("%ld\n", a[dex[dex[0]]]);

	return 0;
}