Cod sursa(job #2129715)

Utilizator trifangrobertRobert Trifan trifangrobert Data 13 februarie 2018 00:23:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

const int DIM = 100010;
int n;
int v[DIM], minim[DIM], pos[DIM];
int dim = 1;
vector <int> sol;

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

int BinarySearch(int x)
{
	if (minim[1] == 0)
		return 1;
	if (x > minim[dim])
		return ++dim;
	int left = 1, right = dim, mid, pos;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (minim[mid] >= x)
		{
			pos = mid;
			right = mid - 1;
		}
		else
			left = mid + 1;
	}
	return pos;
}

void Solve()
{
	int p;
	for (int i = 1;i <= n;++i)
	{
		p = BinarySearch(v[i]);
		minim[p] = v[i];
		pos[i] = p;
	}
	int x = dim;
	int pred = 2000000001;
	for (int i = n;i >= 1;--i)
	{
		if (x == pos[i] && pred > v[i])
		{
			sol.push_back(v[i]);
			--x;
		}
	}
	reverse(sol.begin(), sol.end());
}

void Write()
{
	ofstream fout("scmax.out");
	fout << dim << "\n";
	for (vector <int> ::iterator it = sol.begin();it != sol.end();++it)
		fout << *it << " ";
	fout.close();
}

int main()
{
	Read();
	Solve();
	Write();
	return 0;
}