Cod sursa(job #724692)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 26 martie 2012 18:45:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#define nmax 100010
using namespace std;
int n,v[nmax],P[nmax],S[nmax],L[nmax],poz,nr,max;
void citeste(),rezolva(),afiseaza(int);
int main()
{
	citeste();
	rezolva();
	return 0;
}
void citeste()
{
	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]);
}
void rezolva()
{
	int i,first,last,middle;
	S[1]=L[1]=1;
	nr=1;
	for(i=2;i<=n;i++)
	{
		first=0;
		last=nr;
		poz=-1;
		middle=(first+last)/2;
		for(;first<=last;)
		{
			if(v[L[middle]]<v[i]&&v[L[middle+1]]>=v[i])
			{
				poz=middle;
				break;
			}
			if(v[L[middle+1]]<v[i])
			{
				first=middle+1;
				middle=(first+last)/2;
			}
			else
			{
				last=middle-1;
				middle=(first+last)/2;
			}
		}
		if(poz==-1)
			poz=nr;
		P[i]=L[poz];
		S[i]=poz+1;
		L[poz+1]=i;
		if(nr<poz+1)
			nr=poz+1;
	}
	poz=0;
	for(i=1;i<=n;i++)
		if(S[i]>max)
		{
			max=S[i];
			poz=i;
		}
	printf("%d\n", max);
	afiseaza(poz);
}
void afiseaza(int k)
{
	if(P[k]>0)
		afiseaza(P[k]);
	printf("%d ", v[k]);
}