Cod sursa(job #1235844)

Utilizator pulseOvidiu Giorgi pulse Data 30 septembrie 2014 19:41:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

using namespace std;

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

const int MAXN = 100005;
int N, A[MAXN], L[MAXN], P[MAXN], Best[MAXN], nr, maxim;

int Caut(int x)
{
	int l, r, m;
	l = 0; r = nr;
	while (l <= r)
	{
		m = (l + r) / 2;
		if (A [L[m] ] < x && A[ L[m + 1] ] >= x) return m;
		else if (A[ L[m + 1]] < x) l = m + 1;
		else r = m - 1;
	}
	return nr;
}

void Print(int i)
{
	if (P[i] > 0) Print(P[i]);
	fout << A[i] << " ";
}

int main()
{
	int poz;
	nr = 1;
	fin >> N;
	for (int i = 1; i <= N; ++i) fin >> A[i];
	Best[1] = L[1] = 1; L[0] = 0;
	for (int i = 2; i <= N; ++i)
	{
		poz = Caut(A[i]);
		P[i] = L[poz];
		Best[i] = poz + 1;
		L[poz + 1] = i;
		if (nr < poz + 1) nr = poz + 1;
	}
	poz = 0;
	for (int i = 1; i <= N; ++i)
	{
		if (maxim < Best[i])
		{
			maxim = Best[i];
			poz = i;
		}
	}
	fout << maxim << '\n';
	Print(poz);
	fin.close();
	fout.close();
	return 0;
}