Cod sursa(job #1380111)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 6 martie 2015 22:03:22
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb

#include <fstream>
#include <vector>
#include <algorithm>

const int MAX_N(100001);

int n;
int v [MAX_N], pred [MAX_N];
std::vector<int> s, result;

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 << s.size() << '\n';
	for (int i(s.back()) ; i ; i = pred[i])
		result.push_back(v[i]);
	std::reverse(result.begin(),result.end());
	for (unsigned int i(0) ; i < result.size() ; ++i)
		output << result[i] << ' ';
	output << '\n';
	output.close();
}

inline void Compute (void)
{
	s.push_back(1);
	for (int i(2) ; i <= n ; ++i)
		if (v[i] > v[s.back()])
		{
			pred[i] = s.back();
			s.push_back(i);
		}
		else
		{
			int l(0), r(s.size()), m((l + r) / 2);
			while (l < r)
			{
				if (v[s[m]] < v[i])
					l = m + 1;
				else
					r = m;
				m = (l + r) / 2;
			}
			if (v[s[m]] > s[i])
			{
				pred[i] = pred[s[m]];
				s[m] = i;
			}
		}
}

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