Cod sursa(job #538734)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 21 februarie 2011 21:06:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

#define maxn 100005

int i,N,pmax,nr,imax,Max;
int v[maxn],L[maxn],from[maxn],Smax[maxn];

void citire()
{
	fin >> N;
	for(i=1;i<=N;i++)
		fin >> v[i];
}

int cb(int x)
{
	int st, dr,m;
	st=0; dr= nr; m=(st+dr)/2;
	while(st<=dr)
	{
		if(v[L[m]]<x && v[L[m+1]]>=x) return m;
		else if(v[L[m+1]]<x) st=m+1;
		else dr=m-1;
		m=(st+dr)/2;
	}
	return nr;
}

void pd()
{
	L[0]=0; Smax[1]=L[1]=1; nr=1;
	for(i=2;i<=N;i++)
	{
		pmax=cb(v[i]);
		L[pmax+1]=i;
		Smax[i]=pmax+1;
		from[i]=L[pmax];
		if(nr<pmax+1) nr=pmax+1;
	}
	for(i=1;i<=N;i++)
		if(Smax[i]>Max)
		{
			Max=Smax[i];
			imax=i;
		}
}

void afisare(int k)
{
	if(from[k]>0) afisare(from[k]);
	fout << v[k] << ' ';
}

int main()
{
	citire();
	pd();
	fout << Max << '\n';
	afisare(imax);
}