Cod sursa(job #2931576)

Utilizator matthriscuMatt . matthriscu Data 31 octombrie 2022 15:49:33
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

vector<int> lis(const vector<int>& v) {
	size_t max_length = 1;
	vector<size_t> end(v.size()), prev(v.size());
	end[0] = 0;
	prev[0] = 0;

	auto bs = [&](int value) {
		size_t 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 (size_t i = 1; i < v.size(); ++i)
		if (v[i] < v[end[0]]) {
			end[0] = i;
			prev[i] = i;
		} else if (v[i] > v[end[max_length - 1]]) {
			prev[i] = end[max_length - 1];
			end[max_length++] = i;
		} else {
			size_t pos = bs(v[i]);
			prev[i] = end[pos];
			end[pos + 1] = i;
		}


	vector<int> ans(max_length);
	auto it = ans.rbegin();
	size_t index = end[max_length - 1];
	for (int i = 0; i < max_length; ++i) {
		*(it++) = v[index];
		index = prev[index];
	}

	return ans;
}

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

	vector<int> v(n);
	for (int&x : v)
		fin >> x;

	vector<int> ans = lis(v);
	fout << ans.size() << '\n';
	for (int x : ans)
		fout << x << ' ';
	fout << '\n';
}