Cod sursa(job #3292379)

Utilizator IleaIlea Bogdan Ilea Data 8 aprilie 2025 10:39:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

	int n;
	fin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; ++i)
		fin >> v[i];

	vector<int> prev(n, -1);
	vector<int> tail, index;
	tail.reserve(n);
	index.reserve(n);

	for (int i = 0; i < n; ++i) {
		int pos = lower_bound(tail.begin(), tail.end(), v[i]) - tail.begin();
		if (pos == tail.size()) {
			tail.push_back(v[i]);
			index.push_back(i);
		} else {
			tail[pos] = v[i];
			index[pos] = i;
		}

		if (pos > 0)
			prev[i] = index[pos - 1];
	}

	vector<int> res;
	int j = index.back();
	while (j != -1) {
		res.push_back(v[j]);
		j = prev[j];
	}
	fout << res.size() << '\n';
	for (auto it = res.rbegin(); it != res.rend(); ++it)
		fout << *it << ' ';
	fout << '\n';

	fin.close();
	fout.close();

	return 0;
}