Cod sursa(job #2199877)

Utilizator emiemiEmi Necula emiemi Data 29 aprilie 2018 14:44:44
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <stdio.h>

using namespace std;

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

int n, i, nr, p[100002], u[100002], v[100002], sol[100002];

int caut(int x) {
	int stg = 1, dr =nr;
	int mij;

	if (u[dr] < x)
		return (nr + 1);

	if (u[1] >= x)
		return 1;

	while (stg <= dr) {
		mij = (stg + dr) / 2;
		if (u[mij] < x) {
			if (u[mij + 1] >= x)
				return (mij + 1);
			else
				stg = mij + 1;
		}
		else {
			dr = mij - 1;
		}
	}
}

int main() {
	int poz;

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

	p[1] = 1;
	u[1] = v[1];
	nr = 1;
	printf("%d\n", nr);
	fflush(stdout);
	for (i = 2; i <= n; ++i) {
		poz = caut(v[i]);
		p[i] = poz;
		u[poz] = v[i];
		if (poz > nr)
			++nr;
	}

	g << nr << '\n';

	i = n;
	int m = nr;
	int l = 0;
	sol[0] = 2000000001;
	while (m > 0) {
		while (p[i] != m || v[i] >= sol[l]) {
			--i;
		}
		++l;
		sol[l] = v[i];
		--m;
		--i;
	}

	for (i = 1; i <= nr; ++i)
		g << sol[i] << ' ';
	g << '\n';

	return 0;
}