Cod sursa(job #710465)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 9 martie 2012 19:12:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>

#define MAXN 300010

long arb[MAXN], v[100010], n, i, fr[MAXN], sol, af, poz, S[MAXN], h[MAXN], last;

inline long min(long a, long b) {
	if (a > b && b != 2000000000) 
		return b; 
	return a;
}

int parc(long st, long dr, long pz) {
	if(st == dr) {
		if( arb[pz] >= v[i] ) return 0;
		return st;
	}
	if( arb[pz*2+1] < v[i]) 
		return parc((st+dr)/2 + 1, dr, pz*2+1);
	else return parc(st, (st+dr)/2, pz*2);
}

void update(int unde, int val, int st, int dr, int pz) {
	if( st > unde || unde > dr ) return;
	if( st == dr) {
		arb[pz] = val;
		return;
	}
	
	
	update( unde, val, st, (st+dr)/2, pz*2);
	update( unde, val, (st+dr)/2 +1, dr, pz*2+1);
	arb[pz] = min(arb[pz*2], arb[pz*2+1]);
}

int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	
	scanf("%ld", &n);
	for (i = 1; i <= n; ++i) scanf("%ld", &v[i]);
	for (i = 1; i < MAXN; ++i) arb[i] = 2000000000;
	for (i = 1; i <= n; ++i) {
		af = 0;
		int poz = parc(1, n, 1);
		h[i] = poz + 1;
		if( h[i] > sol) sol = h[i];
		update(poz+1, v[i], 1, n, 1);
	}
	
	printf("%ld\n", sol);
	long caut = sol;
	for (i = n; i >= 1; --i) {
		if (caut == h[i]) {
			S[++S[0]] = v[i];
			--caut;
		}
	}
	for (i = S[0]; i >= 1; --i) printf("%ld ", S[i]);
	return 0;
}