Cod sursa(job #729410)

Utilizator raluca_vacaruVacaru Raluca-Ioana raluca_vacaru Data 29 martie 2012 16:13:36
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#define NMAX 100001

using namespace std;

int n, np, ns, a[NMAX], poz[NMAX], sol[NMAX];

void read() {
	int i;
	scanf("%d", &n);
	for (i=1; i<=n; ++i)
		scanf("%d", &a[i]);
}

int binary_search(int v) {
	int x, y, m;
	x = 1; y = n;
	while (x<y) {
		m = (x+y)/2;
		if (v == a[m]) return v;
		if (v < a[m]) y = m-1;
		else x = m+1;
	}
	return y;
}

void solve() {
	int i, x;
	poz[1] = 1;
	sol[1] = a[1];
	for (i=2; i<=n; ++i) {
		if (a[i] > sol[ns]) {
			sol[++ns] = a[i];
			poz[i] = ns;
		}
		else {
			x = binary_search (a[i]);
			sol[x] = a[i];
			poz[i] = x;
		}
	}
}

void afis() {
	int i;
	printf("%d\n", ns);
	int sf[NMAX];
	int l = ns;
	for (i=n; i>=1; --i)
		if (poz[i] == ns) {
			sf[ns] = a[i];
			--ns;
		}
	for (i=1; i<=l; ++i) 
		printf("%d ",sf[i]);
}

int main () {
	freopen("scmax.in","r",stdin);
	read();
	fclose(stdin);
	solve();
	freopen("scmax.out","w",stdout);
	afis();
	fclose(stdout);
	return 0;
}