Cod sursa(job #936607)

Utilizator BitOneSAlexandru BitOne Data 7 aprilie 2013 21:25:46
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <vector>
#include <cstdlib>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 100011;

int v[NMAX], w[NMAX], idx[NMAX], len[NMAX], aib[NMAX], f[NMAX];

void update(int from, int given, int N)
{
	for(; from <= N; from += (from & -from))
	{
		if(len[aib[from]] < len[given]) aib[from] = given;
	}
}

int query(int from)
{
	int maxIndex = 0;
	for(; from; from -= (from & -from))
	{
		if(len[aib[from]] > len[maxIndex]) maxIndex = aib[from];
	}
	return maxIndex;
}

inline void output(ostream& out, int x)
{
	if(!x) return;
	output(out, f[x]);
	out << v[x] << ' ';
}

int main()
{
	int N, i, maxIndex;
	ifstream in("scmax.in");
	ofstream out("scmax.out");
	
	in >> N;
	for(i = 1; i <= N; ++i)
	{
		in >> v[i];
		w[i] = v[i];
	}
	sort(w + 1, w + N + 1);
	for(i = 1; i <= N; ++i)
	{
		idx[i] = lower_bound(w + 1, w + N + 1, v[i]) - w;
	}
	maxIndex = 0;
	for(i = 1; i <= N; ++i)
	{
		f[i] = query(idx[i] - 1);
		len[i] = 1 + len[f[i]];
		if(len[maxIndex] < len[i]) maxIndex = i;
		update(idx[i], i, N);
	}
	out << len[maxIndex] << '\n';
	output(out, maxIndex);
	
	return EXIT_SUCCESS;
}