Cod sursa(job #560248)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 18 martie 2011 13:22:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<cstdio>
#define NM 100001
int N,v[NM],p[NM],l[NM],poz,maxx,pmax,nr;
inline void citire()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&N);
	for (int i=1; i<=N; ++i)
		scanf("%d",&v[i]);
}
inline int caut(int x)
{
	int p=1,u=nr,m,pok=nr;
	while (p<=u)
	{
		m=(p+u)>>1;
		if (v[l[m]]<x)
			p=m+1;
		else
		{
			u=m-1;
			pok=m;
		}
	}
	return pok;
}
inline void afis(int i)
{
	if (p[i])
		afis(p[i]);
	printf("%d ",v[i]);
}
inline int maxim(int a, int b)
{
	if (a>b) return a;
	return b;
}
inline void scmax()
{
	l[1]=1;
	nr=1;
	for (int i=2; i<=N; ++i)
	{
		if (v[i]>v[l[nr]])
			poz=nr+1;
		else
			poz=caut(v[i]);
		p[i]=l[poz-1];
		l[poz]=i;
		nr=maxim(nr,poz);
		if (nr>maxx)
		{
			maxx=nr;
			pmax=i;
		}
	}
	printf("%d\n",maxx);
	afis(pmax);
}
int main()
{
	citire();
	scmax();
	return 0;
}