Cod sursa(job #818942)

Utilizator toranagahVlad Badelita toranagah Data 18 noiembrie 2012 12:43:29
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N = 100100;

struct nib {
	int max, val, pos;
} aib[MAX_N];
int v[MAX_N];
int pd[MAX_N];
int rec[MAX_N];
int N;
stack<int> st;

void update(int pos, int val, int v);
int query(int pos, int v);

int main() {
	fin >> N;
	for (int i = 1; i <= N; ++i) {
		fin >> v[i];
	}
	int result = 0, lPos = 0;
	for (int i = 1; i <= N; ++i) {
		pd[i] = query(i - 1, v[i]) + 1;
		if (pd[i] > result) {
			result = pd[i];
			lPos = i;
		}
		update(i, pd[i], v[i]);
	}
	for (int i = result; i > 0; --i) {
		st.push(lPos);
		lPos = rec[lPos];
	}

	fout << result << '\n';
	while (!st.empty()) {
		fout << v[st.top()] << ' ';
		st.pop(); 
	}
	return 0;
}

void update(int pos, int val, int v) {
	for (int i = pos; i <= N; i += (i & -i)) {
		aib[i].max = val;
		aib[i].val = v;
		aib[i].pos = pos;
	}
}

int query(int pos, int v) {
	int result = 0;
	for (int i = pos; i > 0; i -= (i & -i)) {
		if (aib[i].max > result && aib[i].val < v) {
			result = aib[i].max;
			rec[pos + 1] = aib[i].pos;
		}
	}
	return result;
}