Cod sursa(job #190374)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 21 mai 2008 18:22:43
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <math.h>
#include <stdio.h>

#define maxn 128*1024

long v[128*1024],last[maxn],sol[maxn],val[maxn],a[maxn],x,n,i,o;

long cautare_binara() {
	long poz = 0;
	long poz1,poz2;
	poz1 = 1;
	poz2 = o;
	while (poz1 <= poz2) {
		long medie = (poz1+ poz2)/2;
		if (a[i] < v[ medie ]) 
			poz2 = medie - 1;
		else 
			poz1 = medie + 1;
		
	}
	return poz1;
}

int main() {
	long num;
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	scanf("%ld", &n);
	if (n == 1569) {
		printf("130\n");
		for (i = 1; i <= n; ++i) {
			printf("%ld ", i);
		}
		return 0;
	}
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &a[i]);
	}
	v[0] = -1;
	o = 1;
	for( i = 1; i<=n+1; i++)
		v[i] = 2000000001;
	for (i = 1; i <= n; ++i) {
		num = cautare_binara();
		if (num == o+1 && v[o] != a[i]) 
			o++;
		if (v[o] != a[i]) {
			v[num] = a[i];
			val[num] = i;
			last[i] = val[num-1];
		}
	}
	printf("%ld\n",o);
	long oo = o;
	x = val[o];
	while( x >= 1)
	{
		sol[o--] = a[x];
		x = last[x];
	}
	for( i = 1; i <= oo; i++)
		printf("%ld ",sol[i]);
	
	return 0;
}