Cod sursa(job #315485)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 15 mai 2009 22:19:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>
int n,nr;
int v[100002];
int p[100002],q[100002];
int sol[100002];

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

int cautare(int x)
{
	int st,dr,m;
	st=1;
	dr=nr;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(q[m]>=x)
			dr=m;
		else
			st=m+1;
	}
	while(q[st]<x)
		st++;
	return st;
}

void rez()
{
	int i,poz,lim,j;
	nr=1;
	q[1]=q[2]=2000000002;
	for(i=1;i<=n;i++)
	{
		poz=cautare(v[i]);
		if(poz==nr+1)
		{
			q[++nr]=v[i];
			p[i]=nr;
			q[nr+1]=2000000002;
		}
		else
		{
			q[poz]=v[i];
			p[i]=poz;
		}
	}
	lim=n;
	for(i=nr;i>=1;i--)
		for(j=lim;j>=1;j--)
			if(p[j]==i)
			{
				sol[i]=v[j];
				lim=j-1;
				break;
			}
	printf("%d\n",nr);
	for(i=1;i<=nr;i++)
		printf("%d ",sol[i]);
}

int main()
{
	read();
	rez();
	return 0;
}