Cod sursa(job #361010)

Utilizator proflaurianPanaete Adrian proflaurian Data 3 noiembrie 2009 12:31:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include<stdio.h>
#define N 100100
int n,i,A[N],P[N],V[N],D[N],L,H,M,LM;
void read(),solve(),print(int C);
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
		scanf("%d",&A[i]);
}
void solve()
{
    LM=1;P[1]=1;V[1]=A[1];
    for(i=2;i<=n;i++)
    {
		if(A[i]>V[LM])
		{
			LM++;P[LM]=i;V[LM]=A[i];D[i]=P[LM-1];continue;
		}
		if(A[i]<=V[1])
		{
			P[1]=i;V[1]=A[i];D[i]=0;continue;
		}
		L=1;H=LM;
		for(;H-L-1;)
		{
			M=(L+H)>>1;if(V[M]<A[i])L=M;else H=M;
		}
		if(A[i]<V[H])
		{
			P[H]=i;V[H]=A[i];D[i]=P[L];
		}
    }
    printf("%d\n",LM); print(P[LM]);
}
void print(int C)
{
    if(!C)return;print(D[C]);printf("%d ",A[C]);
}