Cod sursa(job #2260988)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 15 octombrie 2018 20:15:10
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

ifstream fin("sclmprime.in");
ofstream fout("sclmprime.out");

inline bool prime(int x)
{
	if ((x % 2 == 0 && x != 2) || x < 2)
		return 0;
	for (int i = 3; i * i <= x; i += 2)
		if (x % i == 0)
			return 0;
	return 1;
}

int upperBound(const vector<int> &v, const vector<int> &ind,
               int val, int st, int dr)
{
	while (st <= dr)
	{
		int mij = (st + dr) / 2;

		if (val > v[ ind[mij] ])
			st = mij + 1;
		else
			dr = mij - 1;

	}

	return st;
}

void getLIS(const vector<int> &v)
{
    /// getting LIS
	vector<int> ind(v.size(),0);
	vector<int> prev(v.size(), -1);
	int len = 0;

	for (int i = 0; i < v.size(); ++i)
	{
		int pos = upperBound(v, ind, v[i], 0, len);

		if (pos > 0)
			prev[i] = ind[pos - 1];
		ind[pos] = i;

		len = max(len, pos);
	}

	fout << len + 1 << '\n';

	/// printing LIS
	stack<int> print;

	for (int i = ind[len]; i >= 0; i = prev[i])
		print.push(v[i]);

    for (; !print.empty(); print.pop())
        fout << print.top() << ' ';
}

int main()
{
	int n;
	fin >> n;

	vector<int> v;
	for (int x, i = 0; i < n; ++i)
	{
		fin >> x;
		//if (prime(x))
			v.emplace_back(x);
	}

	getLIS(v);
}