Cod sursa(job #387368)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 27 ianuarie 2010 14:57:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<string.h>

#define N 100002

int v[N], a[N], tata[N], q[N], n, i, u;

int cautbin(int x){
int l, r, mij, last = 0; 
	for (l = 0, r = n; l <= r; ){
		mij = (l+r) / 2;
		if (v[mij] != -1){
			if (a[v[mij]] < x) last = mij, l = mij+1;
			else r = mij - 1;
		}
		else r = mij - 1;
	}
	return last;
}

int main (){
int poz, max;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	scanf("%d", &n);
	for (i = 1; i <= n; i++) scanf("%d", &a[i]);

	memset(v, -1, sizeof(v)); v[0] = 0;
	for (i = 1; i <= n; i++){
		poz = cautbin(a[i]);
		if (v[poz + 1] == -1 || a[v[poz + 1]] > a[i]){
			if (v[poz + 1] == -1) max = poz + 1;
			v[poz + 1] = i;
			tata[i] = v[poz];
		} 
	}
	printf("%d\n", max);
	for (i = v[max]; i > 0; i = tata[i])
		q[++u] = a[i]; 
	for (; u; u--)
		printf("%d ", q[u]);
	
	return 0;
}