Cod sursa(job #1698604)

Utilizator ArkinyStoica Alex Arkiny Data 4 mai 2016 21:00:28
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<stack>
using namespace std;

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

int N;

int v[100010], aib[100010], l[100010], D[100010], up[100010], o[100010], sz;
stack<int> stk;
void update(int x, int v)
{
	for (;x <= N;x += x&(-x))
		if (D[aib[x]] < D[v])
			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()
{
	in >> N;

	for (int i = 1; i <= N;++i)
		in >> v[i], o[i]=l[i] = v[i];

	sort(v + 1, v + N + 1);

	sz = 1;

	for (int i = 2;i <= N;++i)
		if (v[sz] != v[i])
			v[++sz] = v[i];

	for (int i = 1;i <= N;++i)
		l[i] = lower_bound(v + 1, v + sz + 1, l[i]) - v;

	for (int i = 1;i <= N;++i)
	{
		up[i] = query(l[i]-1);
		D[i] = D[up[i]] + 1;
		update(l[i], i);
	}

	int mx = -1, p;

	for (int i = 1;i <= N;++i)
		if (D[i] > mx)
			mx = D[i], p = i;

	out << D[p] << '\n';

	while (p)
		stk.push(o[p]), p = up[p];

	while (stk.size())
		out << stk.top() << ' ', stk.pop();

	return 0;
}