Cod sursa(job #268967)

Utilizator BaduBadu Badu Badu Data 2 martie 2009 01:51:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#define MAX 100005
long dim,n,V[MAX],P[MAX],L[MAX],SOL[MAX];

long Binary_Search(long x){

	long st=1,dr=dim,mj;

	while(st<=dr){

		mj = (st + dr) >> 1;

		if(x <= V[L[mj]]) dr = mj - 1;

		else st = mj + 1;

	}

	return dr;

}

int main(){

	freopen("scmax.in","rt",stdin);

	freopen("scmax.out","wt",stdout);

	scanf("%ld",&n);long i,j;

	for(i=1;i<=n;i++) scanf("%ld",V+i);

	P[1]=L[1]=dim=0;

	for(i=1;i<=n;i++) {

		if(V[i] > V[L[dim]]) { L[++dim] = i;P[i]=L[dim-1];}

		else {

			j = Binary_Search(V[i]);

			P[i] = L[j];

			if(j == dim || V[i] < V[L[j+1]]){

				L[j+1] = i;

				dim = dim<j+1?j+1:dim;

			}

		}

	}

	printf("%ld\n",dim);

	long x = L[dim];
	while(x){
		SOL[++SOL[0]] = V[x];
                x = P[x];
	}

	for(i=SOL[0];i>=1;i--) printf("%ld ",SOL[i]);

	return 0;

}