Cod sursa(job #809233)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 8 noiembrie 2012 04:04:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>
#include <set>
#include <map>
using namespace std;

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

multiset<pair<int, int> > S;
multiset<pair<int, int> >::iterator it;
map<pair<int, int> , pair<int, int> > P;

void dfs(const pair<int, int> & x) {
	if (P.count(x) && P[x].first >= 0) {
		dfs(P[x]);
	}
	printf("%d ", x.first);
}

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

	int n = next_int();
	for (int i = 0; i < n; i++) {
		int x = next_int();
		S.insert(make_pair(x, i));
		it = S.lower_bound(make_pair(x, 0));
		if (it == S.begin())
			P[make_pair(x, i)] = make_pair(-1, -1);
		else {
			--it;
			P[make_pair(x, i)] = *it;
			++it;
		}
		if (++it != S.end())
			S.erase(it);
	}

	printf("%d\n", int(S.size()));
	pair<int, int> x = *S.rbegin();
	dfs(x);
	return 0;
}