Cod sursa(job #699424)

Utilizator lianaliana tucar liana Data 29 februarie 2012 19:16:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<stdio.h>
#define nmax 100005
struct element{long val, poz;};
long st, dr, m, v[nmax], n, poz, an[nmax], lg[nmax], rez, pozrez, i, ne, nrez;
element a[nmax];

void cautare()
{
	st=1;	dr=ne;
	while (st<=dr)
	{	
		m=(st+dr)/2;
		if (a[m].val<v[i])
			st=m+1;
		else
			dr=m-1;
	}
	poz=st;
}

void rezolvare()
{
	for (i=1;i<=n;i++)
	{
		cautare();
		a[poz].val=v[i];	a[poz].poz=i;
		lg[i]=poz;	an[i]=a[poz-1].poz;
		if (poz>ne)
			ne++;
		if (lg[i]>rez)
		{	rez=lg[i];	pozrez=i;	}
	}
}

void afisare()
{
	printf("%ld\n",rez);
	while (pozrez>0)
	{	lg[++nrez]=v[pozrez];	pozrez=an[pozrez];	}
	for (i=nrez;i>=1;i--)
		printf("%ld ",lg[i]);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%ld",&n);
	for (i=1;i<=n;i++)
		scanf("%ld",&v[i]);
	rezolvare();
	afisare();
	return 0;
}