Cod sursa(job #2608040)

Utilizator irimia_alexIrimia Alex irimia_alex Data 30 aprilie 2020 14:45:28
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>

#define NMAX 100001

typedef unsigned int uint;

using namespace std;

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

uint n;
int v[NMAX];
uint secv[NMAX], pred[NMAX];

void read() {
	fin >> n;
	for (uint i = 1;i <= n;++i)
		fin >> v[i];
}

void push(int pos,uint &size) {
	uint low = 1, high = size;
	int x = v[pos];
	if (x > v[secv[size]] || size == 0) {
		secv[++size] = pos;
		pred[pos] = secv[size - 1];
		return;
	}

	while (low <= high) {
		uint mid = low + (high - low) / 2;
		if (v[secv[mid]] >= x && (mid == 1 || v[secv[mid - 1]] < x)) {
			secv[mid] = pos;
			pred[pos] = secv[mid - 1];
			return;
		}
		if (v[secv[mid]] <= x)
			low = mid + 1;
		else
			high = mid - 1;
	}
}

void solve() {
	uint k = 0;
	for (uint i = 1;i <= n;++i) {
		push(i,k);
	}
	fout << k << '\n';
	uint i = secv[k];
	int sol[NMAX];
	uint e = 0;
	while (i > 0) {
		sol[++e] = v[i];
		i = pred[i];
	}
	for (uint i = 1;i <= e;++i)
		fout << sol[i] << ' ';
}

int main()
{
	read();
	solve();

	return 0;
}