Cod sursa(job #1070470)

Utilizator roby2001Sirius roby2001 Data 1 ianuarie 2014 06:09:49
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
/*
    Keep It Simple!
*/
 
#include<stdio.h>

#define Max_N 100002
#define max(a,b) a>b ? a:b

int n,v[Max_N],M[Max_N],P[Max_N],L;

void Print(int x)
{
	if( P[x] ) Print( P[x] );
	 printf("%d ", v[x]);
}

int BinarySearch(int x)
{
	int left = 1, right = L,mid = 0;

	while ( left<=right )
	{
		mid = (left+right)/2;
		if( mid == L && v[M[mid]] <= v[x] ) return L;
		if( v[M[mid]]<v[x] && v[x]<=v[mid+1]) return mid;
		if ( v[M[mid+1]] < v[x] )
			left = mid+1;
		else
			right = mid-1;
	}
	return 0;
}

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

	scanf("%d",&n);

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

	int j;

	for(int i=1; i<=n; i++)
	{
		j = BinarySearch(i);

		P[i] = M[j];

		if( j == L || v[i] < v[M[j+1]] )
		{
			M[j+1] = i;
			L = max(L,j+1);
		}
	}

	printf("%d\n",L);
    Print(M[L]);
}