Cod sursa(job #841705)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 24 decembrie 2012 17:58:18
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>

#define MAXN 100001

int v[MAXN],M[MAXN],P[MAXN];
int i,j,n,lmax;

// cauta cel mai mare l intre 1 si lmax astfel incat M[l] < val
int cauta_binar(int val)
{
	int st=1,dr=lmax;
	int mid;
	while( st < dr ){
		mid = (st+dr+1)/2;
		if( v[M[mid]] >= val ){
			dr = mid-1;
		}		
		else if( v[M[mid]] < val ){
			st = mid;
		}
	}
	
	if( v[M[st]] < val )
		return st;
	else
		return 0;
}

void print(int pos)
{
	if( P[pos] != 0 )
		print(P[pos]);
	printf("%d ",v[pos]);
}

int main(int argc, char* argv[])
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&v[i+1]);
	
	M[1] = 1;
	P[0] = 0;
	lmax = 1;
	int l;
	for(i=2;i<=n;i++){
		l = cauta_binar(v[i]);
		
		P[i] = M[l];
		
		if( l == lmax || v[i] < v[M[l+1]] ){
			M[l+1] = i;
			if( l+1 > lmax )
				lmax = l+1;
		}
	}
	
	
	printf("%d\n",lmax);
	print(M[lmax]);
	
	return 0;	
}