Cod sursa(job #505546)

Utilizator girl_styleBianca Boeriu girl_style Data 2 decembrie 2010 21:10:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream> 

using namespace std;

#include <fstream> 

long n;
long valori[100003],cresc[100003],pred[100003];
long nr;

void citire()
{
	fstream f("scmax.in",ios::in);
	f>>n;
	for (long i = 1 ; i <= n ; i ++ )
	{
		f>>valori[i];
	}
	f.close();
}

long cauta_loc(long x)
{
	long first = 0 ;
	long last = nr ;
	long middle = (first+last)/2;
	while (first <= last )
	{
		if ( valori[cresc[middle]] < x && x <= valori[cresc[middle+1]] )
		{
			return middle ;
		}
		else
		if (valori[cresc[middle+1]] < x)
			first = middle + 1 ;
		else
			last = middle - 1 ;
		middle = (first + last)/2;
	}
	return nr;
}

void subsir()
{
	long loc ;
	cresc[1]=1;
	nr = 1;
	for (long i = 2 ; i <= n ; i ++ )
	{
		loc = cauta_loc(valori[i]);
		cresc[loc+1] = i;
		pred[i]=cresc[loc];
		if (nr < loc + 1) nr = loc + 1;
	}
	fstream g("scmax.out",ios::out);
	g<<nr<<endl;
	nr = cresc[nr] ;
	long afis[100003];
	long cate = 0 ;
	while (nr > 0)
	{
		afis[cate]=valori[nr];
		cate++;
		nr = pred[nr];
	}
	//g<<valori[nr];
	for (long i = cate-1  ; i>= 0 ; i--)
		g<<afis[i]<<" ";
	g.close();
}

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