Cod sursa(job #268964)

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

long Binary_Search(long x){

	long st=1,dr=dim,mj,poz=0;

	while(st<=dr){

		mj = (st + dr) >> 1;

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

		if(x > V[L[mj]]) st = mj + 1;

	}

	return poz;

}

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=1;

	for(i=2;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;

}