Cod sursa(job #175179)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 9 aprilie 2008 17:42:33
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <list>
#include <algorithm>
#include <cmath>

#include <cstdlib>
#include <ctime>

using namespace std;

typedef long long LL;

#define ALL(x) (x).begin(), (x).end()
#define FOR(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)
#define FORI(it, v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
#define pb push_back
#define mp make_pair

#define MAXN 100005

int N, x[MAXN];
vector<int> val;

int aib[MAXN], bst[MAXN], p[MAXN];

inline int aibQuery( int poz )
{
	int rez = 0;
	for (; poz; poz &= (poz - 1))
		rez = max( rez, aib[poz] );
	return rez;
}

inline void aibUpdate( int poz, int val )
{
	for (; poz < MAXN; poz += (poz ^ (poz - 1)) & poz)
		aib[poz] = max( aib[poz], val );
}

int main()
{
	freopen("scmax.in", "rt", stdin);
	freopen("scmax.out", "wt", stdout);

	scanf("%d", &N);
	FOR(i, 0, N)
		scanf("%d", x + i),
		val.pb( x[i] );

	sort( ALL(val) );
	val.resize( unique( ALL(val) ) - val.begin() );

	FOR(i, 0, N)
		x[i] = lower_bound( ALL(val), x[i] ) - val.begin() + 1;
	memset( aib, 0, sizeof(aib) );

	int Max = -1, MaxP = -1;
	FOR(i, 0, N)
	{
		bst[i] = aibQuery(x[i] - 1) + 1;
		aibUpdate( x[i], bst[i] );

		if (bst[i] > Max)
			Max = bst[i],
			MaxP = i;
	}

	printf("%d\n", Max);
	vector<int> sol;

	int poz = MaxP;
	for (; poz; )
	{
		sol.pb( val[ x[poz] - 1 ] );

		int k;
		for (k = poz - 1; k; k--)
		{
			if ( x[k] < x[poz] && bst[k] == bst[poz] - 1 )
				break;
		}
		poz = k;
	}
	reverse( ALL(sol) );
	FORI(it, sol)
		printf("%d ", *it);
	printf("\n");

	return 0;
}