Cod sursa(job #399798)

Utilizator nandoLicker Nandor nando Data 21 februarie 2010 09:00:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>

//<parsing>
#define MAXB 8192
char buf[MAXB];
unsigned ptr=0;

FILE* fin=fopen("scmax.in","rb");

int getInt(){
	while(buf[ptr]<'0'||'9'<buf[ptr]){
		if(++ptr>=MAXB){
			fread(buf,1,MAXB,fin);
			ptr=0;
		}
	}
	int nr=0;
	while('0'<=buf[ptr]&&buf[ptr]<='9'){
		nr=nr*10+buf[ptr]-'0';
		if(++ptr>=MAXB){
			fread(buf,1,MAXB,fin);
			ptr=0;
		}
	}
	return nr;
}
//</parsing>
#define MAX 100010

int vec[MAX],vP[MAX],v[MAX],l[MAX],n,nr=1;

int search(int x){
	int beg=0,end=nr,mdl;
	while (beg<=end){
		mdl=(beg+end)/2;
		if(vec[l[mdl]]<x&&vec[l[mdl+1]]>=x){
			return mdl;
		}else if(vec[l[mdl+1]]<x){
			beg=mdl+1;
		}else{
			end =mdl-1;
		}
   }
   return nr;
}
void write(int i){
	if(vP[i]>0){
		write(vP[i]);
	}
	printf("%d ",vec[i]);
}
int main(){
	fread(buf,1,MAXB,fin);
	freopen("scmax.out","wt",stdout);
	
	int max=0,k,poz;
	
	n=getInt();
	for(int i=1;i<=n;i++){
		vec[i]=getInt();
	}

	v[1]=l[1]=1,l[0]=0;
	for(int i=2;i<=n;i++){
		int poz=search(vec[i]);
		vP[i]=l[poz];
		v[i]=poz+1;
		l[poz+1]=i;
		if(nr<poz+1){
			nr=poz+1;
		}
	}
	max=poz=0;
	for(int i=1;i<=n;i++){
		if(max<v[i]){
			max=v[i],poz=i;
		}
	}
	printf("%d\n",max);
	write(poz);
	fclose(fin);
}