Cod sursa(job #2990633)

Utilizator mati.coldea@gmail.comMatei Coldea [email protected] Data 8 martie 2023 11:36:01
Problema Subsir crescator maximal Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> dp(100005);
vector<int> a(100005);
vector<int> par(100005);
vector<int> ind(100005);
#define INF 10000000
int n;
int main() {
	fin >> n;
	for (int i = 1; i <= n; i++) {
		fin >> a[i];
	}
	
	for (int i = 0; i <= n; i++) {
		dp[i] = INF;
		par[i] = -1;
		ind[i] = -1;
	}
	dp[0] = -INF;

	int nr = 0;
	for (int i = 1; i <= n; i++) {
		int pos = upper_bound(dp.begin()+1 , dp.begin()+1+nr, a[i]) - dp.begin();

		if (dp[pos - 1] < a[i] && a[i] < dp[pos]) {
			if (dp[pos] == INF) {
				nr++;
			}
			else {

			}
			ind[pos] = i;
			par[i] = ind[pos-1];

			dp[pos] = a[i];

		}
	}

	fout << nr<<'\n';

	vector<int> rasp;
	int el_ultim = ind[nr];
	rasp.push_back(a[el_ultim]);
	while (par[el_ultim] != -1) {
		el_ultim = par[el_ultim];
		rasp.push_back(a[el_ultim]);

	}

	reverse(rasp.begin(), rasp.end());

	for (auto i : rasp) {
		fout << i << ' ';
	}




	return 0;
}