Cod sursa(job #471314)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 iulie 2010 02:36:36
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 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];
pair<unsigned, unsigned> _t[nm * 4];

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

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

pair<unsigned, unsigned> max(pair<unsigned, unsigned> p1, pair<unsigned, unsigned> p2) {
	return (p1.first > p2.first? p1: p2);
}

pair<unsigned, unsigned> _query(unsigned n, unsigned v, unsigned l, unsigned r) {

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

void back(unsigned p) {

	if (p > 0) {

		back(P[p]);
		fout << E[p] << ' ';
	
	}

}

int main() {

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

	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, l, v = 1 + p.first);

		// get prev
		P[l] = p.second;

		if (v > maxe) {
			maxe = v;
			pmax = l;
		}

	}

	fout << maxe << '\n';

	back(pmax);

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

	return 0;
}