Cod sursa(job #383795)

Utilizator andreii_93andrei ion andreii_93 Data 18 ianuarie 2010 10:00:29
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 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;
}

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[j]=x[j-1];
	}
	fin[m]=v[x[m]];
	for(i=m-1;i>=1;--i)
		fin[i]=v[pred[i+1]];	
	printf("%d\n",m);
	for(i=1;i<=m;++i)
		printf("%d ",fin[i]);
	return 0;
}