Cod sursa(job #429555)

Utilizator ooctavTuchila Octavian ooctav Data 30 martie 2010 11:40:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define NMAX 100001
int N;
int v[NMAX];//normalizez
int v2[NMAX];//tin vectorul initial
int up[NMAX];
int D[NMAX];
int AIB[NMAX];

void citire()
{
	scanf("%d",&N);
	for(int i = 1 ; i <= N ; i++)
	{
		scanf("%d",&v[i]);
		v2[i] = v[i];
	}
}

void normalizare()
{
	int Dist[NMAX] = {0}, h = 1;
	for(int i = 1 ; i <= N ; i++)
		Dist[i] = v[i];
	sort(Dist  + 1, Dist + N + 1);
	for(int i = 1 ; i <= N ; i++)
		if(Dist[i] != Dist[h])
			Dist[++h] = Dist[i];
	for(int i = 1 ; i <= N ; i++)
		v[i] = lower_bound(Dist + 1, Dist + h + 1, v[i]) - Dist;
	
}

int query(int x)
{
	int mx = 0;
	for(; x ; x -= x^(x - 1) & x)
		if(D[AIB[x]] > D[mx])
			mx = AIB[x];
	return mx;
}

void update(int ind , int x)
{
	for(; x <= N ; x += x^(x - 1) & x)
		if(D[ind] > D[AIB[x]])
			AIB[x] = ind;
}

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

void scriere()
{
	int bst = 0;
	int scr[NMAX], nr = 0;
	for(int i = 1 ; i <= N ; i++)
		if(D[i] > D[bst])
			bst = i;
	printf("%d\n",D[bst]);
	for(int i = bst ; i ; i = up[i])
		scr[++nr] = v2[i];
	for(int i = nr ; i ; i--)
		printf("%d ", scr[i]);

}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	citire();
	normalizare();
	rezolvare();
	scriere();
	return 0;
}