Cod sursa(job #383798)

Utilizator andreii_93andrei ion andreii_93 Data 18 ianuarie 2010 10:08:04
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<cstdio>
const int N = 100000;
//const unsigned int NN=(unsigned int)1<<31;
int v[N],x[N],pred[N],n,m,fin[N];
int caut(int val)
{
    int i; 
	unsigned int step=1;
    for (step = 1; step < m; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step <= m && v[x[i + step]] < val)
           i += step;
	++i;
    return i;
}

void sir(int poz)
{
	if(poz)
	{
		sir(pred[poz]);
		printf("%d ",v[poz]);
	}
}

int main()
{
	int i;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%d",&v[i]);
	x[1]=1;
	pred[1]=0;
	m=1;
	for(i=2;i<=n;++i)
	{
		int j=caut(v[i]);
		if(j > m)
			++m;
		x[j]=i;
		pred[i]=x[j-1];
	}
	printf("%d\n",m);
	sir(x[m]);
	/*
	fin[m]=x[m];
	//for(i=m-1;i>=1;--i)
	while()
		fin[i]=v[pred[i+1]];	
	printf("%d\n",m);
	for(i=1;i<=m;++i)
		printf("%d ",fin[i]);
	*/
	return 0;
}