Cod sursa(job #471318)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 iulie 2010 03:12:37
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <map>
#define nm 131072

using namespace std;

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

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

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

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

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

		_update(n << 1 | 1, v, m + 1, r, k);
	}*/
}

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

	/*if (v <= l) {
		return T[n];
	} else {
		int 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));
		}
	}*/
	return 1;
}

void back(int 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() {

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

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

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

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

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

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

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

	}

	fout << maxe << '\n';

	back(pmax);

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

	return 0;
}