Cod sursa(job #2003753)

Utilizator xSliveSergiu xSlive Data 23 iulie 2017 21:04:58
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <vector>
#include <fstream>
#include <algorithm>
#define pb push_back

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

vector<int> v;
vector<int> lic;

int getPotentialPrevElementIndex(vector<int> &initialVector, vector<int> &tails, int l, int r, int element) {
	int m;
	while (r - l > 1)
	{
		m = l + (r - l) / 2;
		if (initialVector[tails[m]] >= element) 
		{
			r = m;
		}
		else
		{
			l = m;
		}
	}
	return r;
}

int n;

void print(vector<int> &parent, int pos) {
	if (pos == -1) {
		return;
	}
	print(parent, parent[pos]);
	g << v[pos] << " ";
}

void solve() 
{
	if (v.size() == 0)
	{
		g << 0;
		return;
	}

	vector<int> tailIndices(v.size(), 0);
	vector<int> parent(v.size(), -1);

	int length = 1;
	int index = 0;
	tailIndices[0] = 0;
	
	for (int index = 1;index < v.size();index++)
	{
		if (v[index] < v[tailIndices[0]])
		{
			tailIndices[0] = index;
		}
		else if (v[index] > v[tailIndices[length - 1]])
		{
			parent[index] = tailIndices[length - 1];
			tailIndices[length++] = index;
		}
		else
		{
			int poz = getPotentialPrevElementIndex(v, tailIndices, -1, length - 1, v[index]);
			parent[index] = tailIndices[poz - 1];
			tailIndices[poz] = index;
		}
	}

	g << length << '\n';
	/*for (int i = tailIndices[length - 1]; i >= 0; i = parent[i])
		g << v[i] << " ";*/
	print(parent, tailIndices[length - 1]);
}

int main() 
{
	int el;
	f >> n;

	for (int i = 0; i <= n; i++) 
	{
		f >> el;
		v.pb(el);
	}

	solve();

	return 0;
}