Cod sursa(job #559708)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 17 martie 2011 23:56:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>
#define dim 100002

using namespace std;

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

int a[dim],n;
int lg[dim];
int in[dim];
int p[dim];
int nr=1;

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 dinamic()
{
	int i,poz;
	int maxim = 0;
	lg[1] = 1;
	in[1] = 1;
	in[0] = 0;
	
	for(i = 2;i <= n; i++)
	{
		poz=cauta(a[i]);
		in[poz + 1] = i;
		lg[i] = poz + 1;
		p[ i ] = in[poz];
		if(nr < poz + 1)
			nr = nr + 1;
	}
	
	/*
	for(i = 1;i <= n; i++)
		g<<in[i]<<" ";
	g<<"\n";
	
	for(i = 1;i <= n; i++)
		g<<lg[i]<<" ";
	g<<"\n";
	
	for(i = 1;i <= n; i++)
		g<<p[i]<<" ";
	g<<"\n";
	*/
	
	for(i = 1;i <= n; i++)
		if(maxim < lg[i])
		{
			maxim = lg[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();
	dinamic();
	return 0;
}