Cod sursa(job #2143042)

Utilizator theodor.vladTheodor Vlad theodor.vlad Data 25 februarie 2018 15:18:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>

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

void afisare(int);

int n;
int a[100005], s[100005], parent[100005];

int main()
{
	fin >> n;
	for (int i = 1; i <= n; i++)
	{
		fin >> a[i];
	}

	s[1] = 1;
	int len = 1;
	for (int i = 2; i <= n; i++)
	{
		if (a[i] > a[s[len]])
		{
			parent[i] = s[len];
			s[++len] = i;
		}
		else if (a[i] < a[s[1]])
			s[1] = i;
		else
		{
			int st = 0, dr = len + 1;
			while (dr - st > 1)
			{
				int mij = st + (dr - st) / 2;
				if (a[s[mij]] >= a[i])
					dr = mij;
				else
					st = mij;
			}
			parent[i] = s[dr - 1];
			s[dr] = i;
		}
	}

	fout << len << '\n';
	afisare(s[len]);
	return 0;
}

void afisare(int x)
{
	if (parent[x])
		afisare(parent[x]);
	fout << a[x] << ' ';
}