Cod sursa(job #865144)

Utilizator enedumitruene dumitru enedumitru Data 26 ianuarie 2013 04:36:36
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio> 
using namespace std; 
int n,i,nr,poz,maxi,o,h,l; 
int v[100001],lg[100001],b[100001]; 
int caut(int x) 
{	int m,p=1,u=b[0],mx=0; 
	while (p<=u) 
	{	m=(p+u)/2; 
		if(b[m]<x) 
		{	if(m>mx) mx=m; 
			p=m+1; 
		} 
		else u=m-1; 
	} 
	return mx; 
} 
int main() 
{	freopen("scmax.in","r",stdin);  freopen("scmax.out","w",stdout);  
	scanf("%d",&n); 
	for(i=1;i<=n;i++) scanf("%d",&v[i]); 
	b[0]=1; b[1]=v[1]; 
	for(i=2;i<=n;i++) 
	{	poz=caut(v[i]); 
		if(poz==b[0]) b[0]++; 
		b[poz+1]=v[i];
		lg[i]=poz+1; 
	} 
	maxi=0; 
	o=0; 
	for(i=1;i<=n;i++) 
		if(maxi<lg[i]) {maxi=lg[i];o=i;} 
	printf("%d\n",maxi); 
	h=o; l=0; 
	while(maxi>0) 
	{ 	l++; b[l]=v[h]; 
		maxi--; 
		while(lg[h]!=maxi && h>0) h--; 
	} 
	for(i=l;i>=1;i--) 
	{	if (b[i]==0) b[i]=1; 
		printf("%d ",b[i]); 
	}  
	return 0; 
}