Cod sursa(job #1539552)

Utilizator ArkinyStoica Alex Arkiny Data 30 noiembrie 2015 23:28:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#include<algorithm>
using namespace std;

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

#define MAX 100001
int v[MAX],l[MAX],D[MAX],up[MAX],AIB[MAX],O[MAX],N;

void update(int x, int v)
{
	for (;x <= N;x += x&(-x))
		if (D[v] > D[AIB[x]])
			AIB[x] = v;
}
int query(int x)
{
	int mx = 0;
	for (;x;x -= x&(-x))
		if (D[AIB[x]] > D[mx])
			mx = AIB[x];
	return mx;
}
int main()
{
	int i;
	in >> N;
	for (int i = 1;i <= N;++i)
	{
		in >> v[i];
		l[i]=v[i];
		O[i] = v[i];
	}
	sort(l + 1, l + N + 1);
	int length = 1;
	for (i = 2;i <= N;++i)
		if (l[length] < l[i])
			l[++length] = l[i];

	for (i = 1;i <= N;++i)
		v[i] = lower_bound(l + 1, l + length + 1, v[i]) - l;
	
	for (i = 1;i <= N;++i)
	{
		up[i] = query(v[i] - 1);
		D[i] = D[up[i]] + 1;
		update(v[i], i);
	}
	int max = 1;
	for (i = 2; i <= N; ++i)
		if (D[max] < D[i])
			max = i;
	out << D[max]<<'\n';
	for (length = 0;max;max = up[max])
		l[++length] = O[max];
	
	for (i = length;i;--i)
		out << l[i]<<' ';

	return 0;
}