Cod sursa(job #1589822)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 4 februarie 2016 14:43:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

#define NMax 100010

using namespace std;

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

int n, v[NMax], mstack[NMax], rec[NMax], lmax, answ[NMax];

int binSrc(int val)
{
	int st = 1;
	int dr = lmax;
	int sol = -1;

	while (st <= dr) {
		int mid = (st + dr) / 2;

		if (val <= mstack[mid]) {
			dr = mid - 1;
			sol = mid;
		}
		else
			st = mid + 1;
	}

	return sol;
}

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

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

		if (pos != -1) {
			mstack[pos] = v[i];
			rec[i] = pos;
		}
		else {
			++lmax;
			mstack[lmax] = v[i];
			rec[i] = lmax;
		}
	}

	g << lmax << "\n";

	int tmp = lmax;
	for (int i = n; i >= 1; i--) {
		if (rec[i] == tmp) {
			answ[tmp] = v[i];
			tmp--;
		}
	}

	for (int i = 1; i <= lmax; i++)
		g << answ[i] << " ";
	
}