Cod sursa(job #1406151)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 29 martie 2015 16:31:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <stack>

const int MAX_N(100001);

int n, Best, Last;
int v [MAX_N];
int Pred [MAX_N];

inline void Read (void)
{
	std::ifstream input("scmax.in");
	input >> n;
	for (int i(1) ; i <= n ; ++i)
		input >> v[i];
	input.close();
}

inline void Print (void)
{
	std::ofstream output("scmax.out");
	output << Best << '\n';
	std::stack<int> stack;
	for (int i(Last) ; i ; i = Pred[i])
		stack.push(v[i]);
	while (!stack.empty())
	{
		output << stack.top() << ' ';
		stack.pop();
	}
	output.close();
}

inline void Dynamic (void)
{
	std::vector<int> temp = {1};
	for (int i(2) ; i <= n ; ++i)
		if (v[i] > v[temp.back()])
		{
			Pred[i] = temp.back();
			temp.push_back(i);
		}
		else
		{
			int left(0), right(temp.size()), mid((left + right) / 2);
			while (left < right)
			{
				if (v[temp[mid]] < v[i])
					left = mid + 1;
				else
					right = mid;
				mid = (left + right) / 2;
			}
			if (v[i] < v[temp[mid]])
			{
				temp[mid] = i;
				if (mid)
					Pred[i] = temp[mid - 1];
			}
		}
	Best = temp.size();
	Last = temp.back();
}

int main (void)
{
	Read();
	Dynamic();
	Print();
	return 0;
}