Cod sursa(job #191552)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 27 mai 2008 09:55:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>
#define N 100005
int v[N],x[N],pred[N];
/*
int caut(int x,int i){
	for(int j=0;j<i;++j)
		if(v[j]<x)
			return 1;
	return 0;
}
*/
int caut(int k,int u){
	int p,m;
	p=1;
	while(p<u){
		m=(p+u)/2;
		if(k<=v[x[m]])
			u=m;
		else
			p=m+1;
	}
	if(v[x[p]]<k)
		return p+1;
	return p;
}
void afisare(int r){
	if(r==0)
		return;
	afisare(pred[r]);
	printf("%d ",v[r]);
}
int main(){
	int n,i,q=0,p;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	x[0]=0;
	pred[0]=0;
	scanf("%d",&v[++q]);
	pred[q]=0;
	x[q]=1;
	for(i=2;i<=n;++i){
		scanf("%d",&v[i]);
		p=caut(v[i],q);
		if(p>q)
			++q;
		x[p]=i;
		pred[i]=x[p-1];
	}
	printf("%d\n",q);
	afisare(x[q]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}