Cod sursa(job #2486008)

Utilizator VanaMarcVana Marc VanaMarc Data 2 noiembrie 2019 11:17:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

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

int n, A[100005], X[100005], P[100005];
int maximum = -1, maxpos = -1;
int k_x;
stack <int> S;

void read()
{
	fin >> n;
	for (int i = 0; i < n; i++)
		fin >> A[i];
}

int binarysearch(int st, int dr, int v)
{
	if (st == dr)
		return st;
	int mij = (st + dr) / 2;
	if (X[mij] == v)
		return mij;
	if (X[mij] < v)
		return binarysearch(mij + 1, dr, v);
	return binarysearch(st, mij, v);
}

void solve()
{
	int currpos = 1;
	X[0] = A[0];
	for (int i = 1; i < n; i++)
	{
		int poz;
		if (A[i] > X[currpos - 1])
		{
			poz = currpos;
			currpos++;
		}
		else
			poz = binarysearch(0, currpos - 1, A[i]);
		X[poz] = A[i];
		P[i] = poz;
		if (poz > maximum)
		{
			maximum = poz;
			maxpos = i;
		}
	}
}

void create_solution()
{
	int aux_max = maximum;
	for (int i = maxpos; i >= 0 && aux_max >= 0; i--)
		if (P[i] == aux_max)
		{
			aux_max--;
			S.push(A[i]);
		}
}

void print_solution()
{
	fout << maximum + 1 << "\n";
	while (!S.empty())
	{
		fout << S.top() << " ";
		S.pop();
	}
}

int main()
{
	read();
	solve();
	create_solution();
	print_solution();
	return 0;
}