Cod sursa(job #1904831)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 5 martie 2017 20:06:47
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, el[NMax], dp[NMax], lastPos[NMax], answ[NMax], len;

int bin_src(int left, int right, int val)
{
	int ans = -1;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (val <= dp[mid]) {
			ans = mid;
			right = mid - 1;
		}
		else
			left = mid + 1;
	}

	return ans;
}

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

	for (int i = 1; i <= n; i++) {
		int pos = bin_src(1, len, el[i]);

		if (pos == -1) {
			++len;
			dp[len] = el[i];
			lastPos[i] = len;
		}
		else {
			dp[pos] = el[i];
			lastPos[i] = pos;
		}
	}

	int crt = len;
	for (int i = n; i >= 1; i--) {
		if (lastPos[i] == crt) {
			answ[crt] = el[i];
			crt--;
		}
	}

	g << len << "\n";
	for (int i = 1; i <= len; i++)
		g << answ[i] << ' ';
}