Cod sursa(job #1257343)

Utilizator sunt_emoSunt emo sunt_emo Data 7 noiembrie 2014 17:04:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>


void alg(int data[], int best[], int pred[], int ret[], int n, int &len)
{
	int offset = 1;
	best[0] = -1;
	for (int i = 0; i < n; i++)
	{
		int l = 1, r = offset;
		while (l < r)
		{
			int m = l + (r - l) / 2;
			if (data[best[m]] < data[i])
				l = m + 1;
			else
				r = m;
		}
		pred[i] = best[l - 1];
		best[l] = i;
		offset = std::max(offset, l + 1);
	}
	len = offset - 1;
	int i;
	for (i = len - 1, offset = best[offset - 1]; i >= 0; i--, offset = pred[offset])
		ret[i] = data[offset];
}

int main()
{
	std::ifstream in("scmax.in");
	std::ofstream out("scmax.out");
	int data[100000], n, offset = 0, best[100001], pred[100000], ret[100000], len;
	in >> n;
	for (int i = 0; i < n; i++)
		in >> data[i];
	alg(data, best, pred, ret, n, len);
	out << len << '\n';
	for (int i = 0; i < len; i++)
		out << ret[i] << ' ';
	out << '\n';
	in.close(), out.close();
}