Cod sursa(job #241583)

Utilizator eugen.nodeaEugen Nodea eugen.nodea Data 10 ianuarie 2009 14:34:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
//Subsir crescator maximal
#include <stdio.h>
# define nmax 100005
int N, v[nmax], A[nmax], L[nmax];

int main(void)
{
    int i,l,r,m,poz,k=0,j;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &N);
    for (i=1;i<=N;++i)
	scanf("%d", &v[i]);
    for (i=1;i<=N;++i){
	if (v[i] > A[k]) A[++k] = v[i], L[i]=k;
	   else {
	      // caut binar poz. celui mai mic A[] <V[i]
	      l=1; r=k; poz=k;
	      while (l<=r) {
		m=(l+r)/2;
		if (A[m]<v[i]) l=m+1;
			  else poz=m, r=m-1;
	    }
	    A[poz]=v[i]; L[i]=poz;
	}
    }
    printf("%d\n",k);
    for (i=N,j=0;i>0 && k;--i)
	if (L[i]==k) A[++j]=v[i], --k;
    for (i=j;i>0;--i)
	printf("%d ", A[i]);
    return 0;
}