Cod sursa(job #1909338)

Utilizator lflorin29Florin Laiu lflorin29 Data 7 martie 2017 12:23:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

const int nMax = 1e5 + 3;

int n;
int dp[nMax], from[nMax];
pair<int, int>a[nMax]; // valoarea din sir, valoarea normalizata
int last[nMax];

const int INF = 1e8;

void citire() {
	scanf("%d", &n);

	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i].first);
}

void Normalizare() {
	vector<int>aux;

	for (int i = 1; i <= n; ++i)
		aux.push_back(a[i].first);

	sort(aux.begin(), aux.end());
	aux.resize(unique(aux.begin(), aux.end()) - aux.begin());

	for (int i = 1; i <= n; ++i)
		a[i].second = lower_bound(aux.begin(), aux.end(), a[i].first) - aux.begin() + 1;//id de la 1
}

void Print(int pos) {
	if (!pos)
		return;

	Print(from[pos]);
	printf("%d ", a[pos].first);
}

int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	citire();
	Normalizare();

	for (int i = 1; i <= n; ++i)
		dp[i] = INF;

	int longest = 0, pos = 0;

	for (int i = 1; i <= n; i++) {
		int ans = 0;

		for (int p = 17; p >= 0; --p)
			if (ans + (1 << p) <= n && dp[ans + (1 << p)] < a[i].second)
				ans += 1 << p;

		if (ans + 1 > longest) {
			longest = ans + 1;
			pos = i;
		}

		if (a[i].second < dp[ans + 1]) {
			dp[ans + 1] = a[i].second;
		}

		from[i] = last[dp[ans]];
		last[a[i].second] = i;
	}

	printf("%d\n", longest);
	Print(pos);

	return 0;
}