Cod sursa(job #1805680)

Utilizator ArkinyStoica Alex Arkiny Data 14 noiembrie 2016 00:44:36
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<algorithm>
using namespace std;
#define MAX 100001

int lst[MAX], v[MAX], R[MAX], AI[MAX * 4 + 66], pos[MAX], D[MAX], N, i;

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

int query(int x, int y, int l, int r, int k)
{
	if (!y)
		return 0;
	if (x <= l &&  r <= y)
		return AI[k];
	else
	{
		int mid = (l + r) / 2;
		int max = 0, el;
		if (x <= mid)
			max = query(x, y, l, mid, k * 2);
		if (y>mid)
		{
			el = query(x, y, mid + 1, r, k * 2 + 1);
			if (D[el]>D[max])
				max = el;
		}

		return max;

	}
}

void update(int e, int val, int l, int r, int k)
{
	if (l == e && r == e)
		AI[k] = val;
	else
	{
		int mid = (l + r) / 2;
		if (e <= mid)
			update(e, val, l, mid, k * 2);
		else
			update(e, val, mid + 1, r, k * 2 + 1);

		AI[k] = D[AI[k * 2]] > D[AI[k * 2 + 1]] ? AI[k * 2] : AI[k * 2 + 1];

	}
}

int main()
{
	in >> N;
	for (i = 1;i <= N;i++)
		in >> lst[i], R[i] = lst[i];

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

	int l = 1;

	for (i = 2;i <= N;i++)
		if (lst[l] != lst[i])
			lst[++l] = lst[i];
	for (i = 1;i <= N;i++)
		v[i] = lower_bound(lst + 1, lst + l + 1, R[i]) - lst;

	for (i = 1;i <= N;i++)
	{
		pos[i] = query(1, v[i] - 1, 1, N, 1);
		D[i] = 1 + D[pos[i]];
		update(v[i], i, 1, N, 1);
	}
	int mx = 0;
	for (i = 1;i <= N;i++)
		if (D[i]>D[mx])
			mx = i;
	int j = 0;
	for (i = mx;i;i = pos[i])
	{
		lst[++j] = R[i];
	}
	out << D[mx] << '\n';
	for (i = j;i;--i)
		out << lst[i] << " ";

	return 0;
}