Cod sursa(job #2151746)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 4 martie 2018 21:05:03
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <vector>

std::ifstream fin ("scmax.in");
std::ofstream fout ("scmax.out");

int n, x, i, pos, len = 1;

std::vector <int> v, ind, prev;

/// binary search
inline int upperBound ( int x )
{
	int st, dr, mij;

	st = 0, dr = len - 1;
	while ( st < dr )
	{
		mij = (st + dr) / 2;

		if ( x > v[ ind[mij] ] )
			st = mij + 1;
		else
			dr = mij - 1;
	}

	return st;
}

void printSol ( int i )
{
	if ( i >= 0 )
	{
		printSol ( prev[i] );
		fout << v[i] << " ";
	}
}

int main()
{
	std::ios::sync_with_stdio (false);

	fin >> n;

	for ( i = 0; i < n; ++i )
	{
		fin >> x;
		v.push_back( x ), ind.push_back( 0 ), prev.push_back( -1 );
	}

	for ( i = 1; i < n; ++i )
		if ( v[i] <= v[ ind[0] ] )
			ind[0] = i;
		else if ( v[i] > v[ ind[ len - 1 ] ] )
		{
			prev[i] = ind[ len - 1 ];
			ind [ len++ ] = i;
		}
		else
		{
			pos = upperBound( v[i] );

			prev[i] = ind[ pos - 1 ];
			ind[pos] = i;
		}

	fout << len << '\n';

	printSol ( ind[ len - 1 ] );
}