Cod sursa(job #2175559)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 16 martie 2018 17:48:13
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <algorithm>
#include <map>

using namespace std;

FILE * fin=fopen("scmax.in","r");
FILE * fout=fopen("scmax.out","w");

inline int last2(int x)
{
	return x&(x ^ (x - 1));
}

void update(int x, int nr);
int query(int x);

int n, nr, maxim, v[100005], aux[100005], best[100005], pre[100005], aib[100005];
map<int, int> cod;

int main()
{
	int i, x;

	fscanf(fin, "%d", &n);
	for (i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &v[i]);
		aux[i] = v[i];
	}
	sort(aux + 1, aux + 1 + n);
	for (i = 1; i <= n; i++)
		if (!cod[aux[i]])
			cod[aux[i]] = ++nr;
	for (i = 1; i <= n; i++)
		aux[i] = cod[v[i]];
	for (i = 1; i <= n; i++)
	{
		pre[i] = query(aux[i] - 1);
		best[i] = 1 + best[pre[i]];
		update(aux[i], i);
	}
	for (i = 1; i <= n; i++)
		if (best[i] > best[maxim])
			maxim = i;
	nr = 0;
	fprintf(fout, "%d\n", best[maxim]);
	while (maxim)
	{
		aux[++nr] = v[maxim];
		maxim = pre[maxim];
	}
	for (i = nr; i >= 1;i--)
		fprintf(fout, "%d ", aux[i]);
	fprintf(fout, "\n");
	return 0;
}

void update(int x, int nr)
{
	for (; x <= n; x += last2(x))
		if (best[nr] > best[aib[x]])
			aib[x] = nr;
}

int query(int x)
{
	int maxim=0;

	for (; x >= 1; x -= last2(x))
		if (best[aib[x]] > best[maxim])
			maxim = aib[x];
	return maxim;
}