Cod sursa(job #216956)

Utilizator gicagica popescu gica Data 26 octombrie 2008 13:14:49
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

template<typename T> inline void checkMax(T &a, T &b) { a = (a > b ? a : b); }

const int MAX_N = 1024;

int n;
int a[MAX_N], d[MAX_N], b[MAX_N];
int t[MAX_N];
pair<int, int> aib[MAX_N];

void update(int poz, int val, int prov) {
	int p = poz;
	while (p <= n) {
		checkMax(aib[p], make_pair(val, prov));
		p += p ^ (p-1) & p;
	}
}

pair<int, int> query(int poz) {
	pair<int, int> ret = make_pair(0, 0);
	while (poz) {
		checkMax(ret, aib[poz]);
		poz &= poz - 1;
	}
	return ret;
}

void write(int poz) {
	if (!poz) return;
	write(t[poz]);
	printf("%d ", b[poz]);
}

void normalize() {
	vector<int> v;
	for (int i = 1; i <= n; ++i)
		v.push_back(a[i]);

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

	for (int i = 1; i <= n; ++i) {
		b[i] = a[i];
		a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
	}
}

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

	scanf("%d", &n);
	for (i = 1; i <= n; ++i) scanf("%d", a+i);

	normalize();

	for (i = 1; i <= n; ++i) {
		d[i] = 1; t[i] = 0;

		pair<int, int> p = query(a[i]-1);
		if (p.first + 1 > d[i]) {
			d[i] = p.first + 1;
			t[i] = p.second;
		}
		update(a[i], d[i], i);
	}

	int sol = 0;
	int end = 0;
	for (i = 1; i <= n; ++i) 
		if (d[i] > sol) {
			sol = d[i];
			end = i;
		}
	printf("%d\n", sol);
	write(end);
}