Cod sursa(job #561631)

Utilizator blastoiseZ.Z.Daniel blastoise Data 20 martie 2011 21:40:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <string.h>

#define Dim 100001

int v[Dim],q[Dim],d[Dim];

int BS(int x,int L,int R)
{
	if(L<=R)
	{
		int M=L+(R-L)/2;

		if(x>=q[M]) return BS(x,L,M-1);
		else return BS(x,M+1,R);
	}
	else return L;
}

int main()
{
	int i,N,pos,size;

	freopen("scmax.in","r",stdin);

	scanf("%d",&N);
	for(i=0;i<N;i++) scanf("%d",&v[i]);

	memset(q,0,sizeof(q));
	memset(d,0,sizeof(d));

	d[N-1]=1;
	q[1]=v[N-1];
	size=1;

	for(i=N-2;i>-1;i--)
		if(q[size]>v[i])
		{
			q[++size]=v[i];
			d[i]=size;
		}
		else
		{
			pos=BS(v[i],1,size);
			q[pos]=v[i];
			d[i]=pos;
		}

	freopen("scmax.out","w",stdout);

	i=0;
	printf("%d\n",size);

	while(i<=N&&size)
	{
		while(d[i]!=size&&i<=N) i++;
		printf("%d ",v[i]);
		i++;
		size--;
	}
	printf("\n");

	return 0;
}