Cod sursa(job #2923963)

Utilizator matthriscuMatt . matthriscu Data 21 septembrie 2022 21:27:05
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
using namespace std;

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

	int n;
	fin >> n;

	vector<int> v(n), end(n), parent(n), length(n);
	for (int& x : v)
		fin >> x;

	end[0] = 0;
	length[0] = 1;
	parent[0] = 0;
	int max_length = 1;

	auto bs = [&](int value) {
		int index = 0, step = 1;
		for (; step < max_length; step <<= 1);

		for (; step; step >>= 1)
			if (index + step < max_length && v[end[index + step]] <= value)
				index += step;
		
		return index;
	};

	for (int i = 1; i < n; ++i) {
		if (v[i] < v[end[0]]) {
			end[0] = i;
			parent[i] = i;
		} else if (v[i] > v[end[max_length - 1]]) {
			parent[i] = end[max_length - 1];
			end[max_length++] = i;
		} else {
			int pos = bs(v[i]);
			parent[i] = end[pos];
			end[pos + 1] = i;
		}
	}

	fout << max_length << '\n';

	vector<int> seq(max_length);
	seq[0] = end[max_length - 1];
	for (int i = 1; i < max_length; ++i)
		seq[i] = parent[seq[i - 1]];

	for (int i = max_length - 1; i >= 0; --i)
		fout << v[seq[i]] << ' ';
	fout << '\n';
}