Cod sursa(job #551233)

Utilizator flashthdPop Razvan flashthd Data 10 martie 2011 15:55:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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;
				//st=m+1;
			else
				st=m+1;
				//dr=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;
		
	}
	 // for( i = 1; i <= n; i++ )
		//  g<<p[i]<<" ";
	  //g<<"\n";
		g<<maxim<<"\n";//<<" "<<poz<<"\n";
		//g<<in[i]<<" ";
		afisare(poz);
		
	
	
}

void afisare(int x)
{
	if(p[x]!=0)
	{
		afisare(p[x]);
		
	}
	g<<a[x]<<" ";
	
}


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