Cod sursa(job #1268660)

Utilizator fhandreiAndrei Hareza fhandrei Data 21 noiembrie 2014 11:37:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;

// Constante
const int sz = 100001;

// Functii
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b));
void route(int node);
bool cmp(int a, int b);

// Variabile
ifstream in("scmax.in");
ofstream out("scmax.out");

int num;

int values[sz];
int best[sz];
int father[sz];


// Main
int main()
{
	in >> num;
	int right = 0;
	for(int i=1 ; i<=num ; ++i)
	{
		in >> values[i];
		int lenMax = binarySearch(best, 0, right, i, cmp);
		if(best[lenMax] && values[best[lenMax]] <= values[i])
			continue;
		best[lenMax] = i;
		father[i] = best[lenMax-1];
		right = max(right, lenMax);
	}
	
	out << right << '\n';
	route(best[right]);
	out << '\n';
	
	in.close();
	out.close();
	return 0;
}

template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
	if(comp(value, data[left]))
		return left;
	
	if(!comp(value, data[right]))
		return right+1;
	
	int dif = right - left + 1;
	data += left;
	right -= left;
	int pos = 0;
	int power = 0;
	
	while(1<<++power <= dif);
	
	while(power--)
	{
		if(right <= pos + (1<<power))
		{
			if(power < 0)
				break;
			continue;
		}
		if(!comp(value, data[pos+(1<<power)]))
			pos += 1<<power;
	}
	
	return pos+left+1;
}

void route(int node)
{
    if(father[node])
        route(father[node]);
    out << values[node] << ' ';
}

bool cmp(int a, int b)
{
	return values[a] <= values[b];
}