Cod sursa(job #1404484)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 28 martie 2015 11:53:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <algorithm>
#include <fstream>
#include <map>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<int> v, LIS, parent;
map<int, int> m;

void findLIS()
{
	parent.resize(n);
	for (size_t i = 0; i < v.size(); ++i)
	{
		parent[i] = -1;
		if (m.find(v[i]) == m.end())
		{
			map<int, int>::iterator nextElement = m.lower_bound(v[i]);
            if (nextElement != m.end())
				m.erase(nextElement);
            m[v[i]] = i;

            map<int, int>::iterator it = m.find(v[i]);
            map<int, int>::iterator prevIt = it;
            if (it != m.begin())
			{
				--prevIt;
				parent[it -> second] = prevIt -> second;
			}
		}
	}
	int p = m.rbegin() -> second;
	while (p != -1)
	{
		LIS.push_back(v[p]);
		p = parent[p];
	}
    reverse(LIS.begin(), LIS.end());
}

int main()
{
	fin >> n;
	for (int i = 0; i < n; ++i)
	{
		int x;	fin >> x;
		v.push_back(x);
	}
	findLIS();

	fout << LIS.size() << '\n';
	for (size_t i = 0; i < LIS.size(); ++i)
		fout << LIS[i] << ' ';
	return 0;
}