Cod sursa(job #1414255)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 2 aprilie 2015 14:26:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>

#define NMax 100010

using namespace std;

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

int n, v[NMax], stack[NMax], rec[NMax], lsc, sol[NMax];

int binSrc(int st, int dr, int elem)
{
	int sol = -1, mid = 0;
	
	while (st <= dr) {
		mid = (st + dr) / 2;
		if (elem > stack[mid])
			st = mid + 1;
		else {
			dr = mid - 1;
			sol = mid;
		}
	}

	return sol;
}

int main()
{
	f >> n;
	for (int i = 1; i <= n; i++)
		f >> v[i];

	for (int i = 1; i <= n; i++) {
		int ind = binSrc(1, lsc, v[i]);

		if (ind == -1) {
			stack[++lsc] = v[i];
			rec[i] = lsc;
		}
		else {
			stack[ind] = v[i];
			rec[i] = ind;
		}
	}

	g << lsc << "\n";

	int len = lsc;
	for (int i = n; i >= 1; i--) {
		if (len == rec[i]) {
			sol[len] = v[i];
			len--;
		}
	}

	for (int i = 1; i <= lsc; i++)
		g << sol[i] << " ";
}