Cod sursa(job #809238)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 8 noiembrie 2012 05:24:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

inline int next_int() {
	int d;
	scanf("%d", &d);
	return d;
}

vector<int> LIS(const vector<int> & X) {
	int n = X.size();
	vector<int> P(n + 1, -1);
	vector<int> M(n + 1, -1);
	M[1] = 0;
	int L = 1;
	for (int i = 1; i < n; i++) {
		int lo = 0, hi = L + 1;
		while (hi - lo > 1) {
			int mid = (lo + hi) / 2;
			if (X[M[mid]] < X[i]) {
				lo = mid;
			} else {
				hi = mid;
			}
		}
		int j = lo;
		P[i] = M[j];
		if (j == L || X[i] < X[M[j + 1]]) {
			M[j + 1] = i;
			L = max(L, j + 1);
		}
	}
	vector<int> ans;
	int x = M[L];
	while (x != -1) {
		ans.push_back(X[x]);
		x = P[x];
	}
	reverse(ans.begin(), ans.end());
	return ans;
}

int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	int n = next_int();
	vector<int> A;
	for (int i = 0; i < n; i++) {
		A.push_back(next_int());
	}
	vector<int> ans = LIS(A);
	printf("%d\n", int(ans.size()));
	for (size_t i = 0; i < ans.size(); i++) {
		printf("%d ", ans[i]);
	}
}