Cod sursa(job #471315)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 iulie 2010 02:55:55
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <map>
#define nm 100001

using namespace std;

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

map<unsigned, unsigned> M;
unsigned E[nm];
unsigned P[nm];
unsigned T[nm * 4];

inline unsigned maxf(unsigned a, unsigned b) {
	return (a > b? a: b);
}

void _update(unsigned n, unsigned v, unsigned l, unsigned r, unsigned k) {

	if (l > r) {
		return;
	} else if (v <= l) {
		T[n] = maxf(k, T[n]);
	} else {
		unsigned m = (l + r) >> 1;
		if (v <= m) {
			_update(n << 1, v, l, m, k);
		} 
		if (1) {
			_update(n << 1 | 1, v, m + 1, r, k);
		}
	}
}

unsigned _query(unsigned n, unsigned v, unsigned l, unsigned r) {

	if (l > r) {
		return 0;
	} else if (v <= l || l == r) {
		return T[n];
	} else {
		unsigned m = (l + r) >> 1;
		if (v <= m) {
			return maxf(T[n], _query(n << 1, v, l, m));
		} else {
			return maxf(T[n], _query(n << 1 | 1, v, m + 1, r));
		}
	}
}

void back(unsigned p) {

	if (p > 0) {

		int i;
		for (i = p - 1; i > 0 && !(E[i] < E[p] && P[i] + 1 == P[p]); --i);
		back(i);
		fout << E[p] << ' ';
	
	}

}

int main() {

	unsigned N, i, l, v, k, p, maxe, pmax;
	map<unsigned, unsigned>::iterator j;

	fin >> N;
	
	// populate structures
	for (i = 1, maxe = 0; i <= N; ++i) {
		fin >> v;
		E[i] = v;
		M.insert(pair<unsigned, unsigned>(v, 0));
	}

	// create positions
	for (j = M.begin(), i = 1; j != M.end(); ++j, ++i) {
		j->second = i;
	}

	// update
	for (l = 1; l <= N; ++l) {
		
		// get this position
		k = M.find(E[l])->second;

		// get pair
		p = _query(1, k, 1, i - 1);

		// update this length
		_update(1, k + 1, 1, i - 1, P[l] = 1 + p);

		if (P[l] > maxe) {
			maxe = P[l];
			pmax = l;
		}

	}

	fout << maxe << '\n';

	back(pmax);

	fin.close();
	fout.close();

	return 0;
}