Cod sursa(job #2685175)

Utilizator StefanSanStanescu Stefan StefanSan Data 16 decembrie 2020 10:48:56
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include      <iostream>
#include      <fstream>
#include      <algorithm>

using namespace std;

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

int n, a[100001], dp[100001], v[100001], p[100001], index;

int main() {

	ios::sync_with_stdio(false);
	in.tie(NULL), out.tie(NULL);

	in >> n;
	for (int i = 1; i <= n; i++) in >> a[i];

	dp[++index] = a[1];
	p[1] = 1;

	for (int i = 2; i <= n; i++) {
		if (a[i] > dp[index]) {
			dp[++index] = a[i];
			p[i] = index;
		}
		else {
			int left = 1, right = index, poz = index + 1;
			while (left <= right) {
				int mid = (right + left) / 2;
				if (dp[mid] >= a[i]) {
					poz = mid;
					right = mid - 1;
				}
				else left = mid + 1;
			}
			dp[poz] = a[i];
			p[i] = poz;
		}
	}
	out << index << '\n';

	int j = n;
	for (int i = index; i >= 1; i--) {
		while (p[j] != i) j--;
		v[i] = a[j];
	}
	for (int i = 1; i <= index; i++) out << v[i] << ' ';
}