Cod sursa(job #471321)

Utilizator vlad.maneaVlad Manea vlad.manea Data 18 iulie 2010 03:44:16
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define nm 131072

using namespace std;

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

int E[nm], F[nm], P[nm], T[nm * 4];
vector< pair<int, int> > M[666013];

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

inline int gethash(int v) {



	return 0;

}

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;
	vector< pair<int, int> >::iterator r;

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

	// sort data
	sort(F + 1, F + N + 1);

	// create positions
	for (i = 1; i <= N; ++i) {
		M[F[i] % 666013].push_back(pair<int, int>(F[i], i));
	}

	// update
	for (--i, l = 1; l <= N; ++l) {

		// get position
		p = E[l] % 666013;
		for (r = M[p].begin(); r != M[p].end(); ++r) {
			if (r->first == E[l]) {
				k = r->second;
				break;
			}
		}

		// 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;
}