Cod sursa(job #2177624)

Utilizator VemorJohn Doe Vemor Data 18 martie 2018 18:36:20
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, lg, l[100003], V[100003], father[10003], sol[10003];

int bsearch(int V[], int N, int val) {
	int ans, log;
	for (log = 1; log < N; log <<= 1);
	for (ans = N; log; log >>= 1) {
		if (ans - log > 0 && V[ans - log] > val) {
			ans -= log;
		}
	}
	if (V[ans] < val) {
		++ans;
	}
	return ans;
}

int main() {
	fin >> N;

	for (int i = 1; i <= N; ++i)
		fin >> V[i];

	l[1] = V[1];
	father[1] = 1;
	lg = 1;

	for (int i = 2; i <= N; ++i)
	{
		int poz = upper_bound(l + 1, l + lg + 1, V[i]) - l;
//		int poz = bsearch(l, lg, V[i]);
		if (l[poz - 1] == V[i])
			--poz;

		l[poz] = V[i];
		father[i] = poz;

		lg = max(lg, poz);
	}
	int l2 = lg;

	fout << lg << '\n';

	for (int i = N; i; --i)
		if (father[i] == l2)
		{
			sol[l2--] = i;
		}

	for (int i = 1; i <= lg; ++i)
		fout << V[sol[i]] << ' ';

	fout << '\n';

	return 0;
}