Cod sursa(job #570363)

Utilizator bacerandreiBacer Andrei bacerandrei Data 2 aprilie 2011 22:35:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#define MAX 100004

using namespace std;

int v[MAX], a[MAX], b[MAX]; 
int length, n;


int BinarySearch(int i)
{
	int middle, left=1, right=length, max_length=0; 
	while(left<=right) 
	{
		middle = (left+right)/2; 
		if(v[a[middle]]<v[i])
		{
			max_length=middle; 
			left = middle+1; 
			}
		else 
			right = middle-1; 
		}
	return max_length; 
}


void dp()
{
	int i, j;
	length = 1;
	a[1]=1; 
	for(i = 2 ; i <= n ; ++i) 
	{
		j=BinarySearch(i); 
		if(!a[j+1]) 
		{
			a[j+1] = i;
			length++;
		}
		else 
			if(v[a[j+1]]>v[i]) 
				a[j+1] = i;
			b[i] = a[j]; 
	}
}


void write(int i)
{
	if(b[i]) 
		write(b[i]); 
	printf("%d ",v[i]); 
}

int main()
{
	freopen("scmax.in" , "r" , stdin);
	freopen("scmax.out","w",stdout);

	scanf("%d\n", &n);
	for (int i = 1 ; i <= n ; ++i)
		scanf("%d ", &v[i]);
	dp();

	printf("%d\n",length); 
	write(a[length]); 

	fclose(stdin);
	fclose(stdout);
	return 0;
}