Cod sursa(job #410103)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 4 martie 2010 09:21:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <algorithm>
using namespace std;

#define DIM 100005

int b[DIM],a[DIM],n,poz,t[DIM],sol;
char buff[DIM];

inline void pars (int &nr)
{
	nr=0;
	while(buff[poz]<'0' || '9'<buff[poz])
		if(++poz==DIM)
		{
			fread (buff,1,DIM,stdin);
			poz=0;
		}
	while('0'<=buff[poz] && buff[poz]<='9')
	{
		nr=nr*10+buff[poz]-'0';
		if(++poz==DIM)
		{
			fread (buff,1,DIM,stdin);
			poz=0;
		}
	}
}

void read ()
{
    int i;
    pars (n);
    for (i=1;i<=n;++i)
		pars(a[i]);
}

int cbin (int x)
{
	int st=1,dr=sol,mij,rez=0;
	while(st<=dr)
	{
		mij=(st+dr)/2;
		if(a[b[mij]]<x)
			rez=mij,st=mij+1;
		else
			dr=mij-1;
	}
	return rez;
}

void show (int x)
{
	if(t[x])
		show (t[x]);
	printf("%d ",a[x]);
}
void solve ()
{
	int i;
	b[1]=1;
	sol=1;
	for(i=2;i<=n;++i)
	{
		poz=cbin(a[i]);
		b[poz+1]=i;
		t[i]=b[poz];
		if(poz+1>sol)
			++sol;
	}
	printf("%d\n",sol);
	show (b[sol]);
}

int main ()
{
    freopen ("scmax.in","r",stdin);
    freopen ("scmax.out","w",stdout);
    read ();
    solve ();
    return 0;
}