Cod sursa(job #392977)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 8 februarie 2010 17:54:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
using namespace std;
#include<stdio.h>
const int NMAX=100005;
int n, v[NMAX],x[NMAX], pred[NMAX], s[NMAX],lmax;/* v-elementele, x[i]=pozitia celui mai mic element 
care poate fi ultimul intr-un subsir crescator de lungime i; pred[i]=pozitia predecesorului 
elementului i in subsirul format; s[i]=lungimea celui mai lung subsir crescator maximal care 
se poate forma avand ca ultim element v[i];*/

void RUinit()
{
	freopen("scmax.in", "r",stdin);
	freopen("scmax.out", "w",stdout);
	scanf("%d", &n);
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]);
	s[1]=1;x[1]=1;lmax=1;
}

int RUbin(int val)
{
	int i,pas=1<<16;
	for(i=0;pas;pas>>=1)
		if(i+pas<=lmax &&v[x[i+pas]]<val )
			i+=pas;
	return i+1;
}
	
void RUrez()
{
	int t;
	for(int i=2;i<=n;++i)
	{
		t=RUbin(v[i]);
		if(t>lmax)++lmax;
		x[t]=i;
		pred[i]=x[t-1];
	}
}

int rec(int i)
{
	if(pred[i])
		rec(pred[i]);
	printf("%d ", v[i]);
}

void RUafis()
{
	int i=1;
	printf("%d\n", lmax);
	rec(x[lmax]);
}

int main()
{
	RUinit();
	RUrez();
	RUafis();
	return 0;
}