Cod sursa(job #341821)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 19 august 2009 17:16:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>

using namespace std;

#define mp make_pair
#define pb push_back
#define sz(c) (int)((c).size())
#define f first
#define s second

#define fin  "scmax.in"
#define fout "scmax.out"

#define NMAX 100100

int N, elMin[NMAX], best;
int v[NMAX], tat[NMAX];

void ReadData()
{
	ifstream f(fin);

	f >> N;
	for ( int i = 1; i <= N; ++i )
		f >> v[i];

	f.close();
}

void Solve()
{
	int i, lo, hi, mid;

	best = 0;
	for ( i = 1; i <= N; ++i )
	{
		lo = 0; hi = best;

		while ( lo <= hi )
		{
			mid = lo + (hi-lo)/2;
			if ( v[ elMin[mid] ] < v[i] )
				lo = mid + 1;
			else
				hi = mid - 1;
		}

		if ( lo > best )
			best = lo, elMin[ best ] = i;
		if ( v[i] < v[ elMin[ lo ] ] )
			elMin[ lo ] = i;
		if ( lo > 0 ) 
			tat[i] = elMin[lo - 1];
		else
			tat[i] = 0;
	}
}

void trace(int x, ofstream &f)
{
	if ( x == 0 ) return ;
	trace(tat[x],f);
	f << v[x] << " ";
}

void PrintSol()
{
	ofstream f(fout);

	f << best << endl;
	trace(elMin[best],f);

	f.close();
}

int main()
{
	ReadData();
	Solve();
	PrintSol();
	return 0;
}