Cod sursa(job #2339502)

Utilizator aurelionutAurel Popa aurelionut Data 9 februarie 2019 00:07:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 100005;
int n, v[NMAX], dp[NMAX], minim[NMAX], ans[NMAX], m;

int BS(int val)
{
	if (val > minim[m])
		return ++m;
	int left = 1, right = m, mid, p;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (val <= minim[mid])
		{
			p = mid;
			right = mid - 1;
		}
		else
			left = mid + 1;
	}
	return p;
}

int main()
{
	ifstream fin("scmax.in");
	ofstream fout("scmax.out");
	fin >> n;
	for (int i = 1;i <= n;++i)
		fin >> v[i];
	dp[1] = m = 1;
	minim[1] = v[1];
	for (int i = 2;i <= n;++i)
	{
		int p = BS(v[i]);
		dp[i] = p;
		minim[p] = v[i];
	}
	int lg = 1, dplg;
	for (int i = 1;i <= n;++i)
		lg = max(lg, dp[i]);
	dplg = lg;
	for (int i = n;i >= 1;--i)
		if (lg == dp[i])
			ans[lg--] = v[i];
	fout << dplg << "\n";
	for (int i = 1;i <= dplg;++i)
		fout << ans[i] << " ";
	fin.close();
	fout.close();
	return 0;
}