Cod sursa(job #1118622)

Utilizator cristi103tiron cristian cristi103 Data 24 februarie 2014 12:16:43
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#define dim 100002
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int a[dim],l[dim],in[dim],p[dim];
int n;
int nr;

void afisare(int x);
void citire()
{
	int i;
	f>>n;
	for(i=1;i<=n;i++)
		f>>a[i];

}

int cauta(int x)
{
	int st,dr,m;
	st=0;
	dr=nr;
	while(st<=dr)
	{
		m=(st+dr)/2;
		if(a[in[m]]<x&&a[in[m+1]]>=x)
			return m;
		else
			if(a[in[m+1]]>x)
				dr=m-1;

			else
				st=m+1;

	}
	return nr;


}









void rezolva()
{
	int i,poz,maxim;
	nr=1;
	l[1]=in[1]=1;
	l[0]=0;
	for( i = 2; i <= n; i++)
	{
		poz=cauta(a[i]);
		in[poz+1]=i;
		p[i]=in[poz];
		l[i]=poz+1;
		if(poz+1>nr)
			nr=nr+1;
	}
	maxim=l[1];
	poz=1;
	for( i = 2; i <= n; i++ )
	  if(maxim<l[i])
	{
		maxim=l[i];
		poz=i;

	}

		g<<maxim<<"\n";

		afisare(poz);



}

void afisare(int x)
{
	if(p[x]!=0)
	{
		afisare(p[x]);

	}
	g<<a[x]<<" ";

}


int main()
{
	citire();
	rezolva();
	return 0;
}