Cod sursa(job #280325)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 13 martie 2009 12:25:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.67 kb
#include <stdio.h>
#define N 100005
int n,v[N],pre[N],s[N],c;
int caut(int x){
	int st=1,dr=c,m;
	if(v[s[c]]<x) return dr+1;
	while(st<dr){
		m=(st+dr)/2;
		if(v[s[m]]>=x) dr=m;
		else st=m+1;
	}
	if(v[s[st]]<x) st++;
	return st;
}
void afiseaza(int x){
	if(pre[x]>0)
		afiseaza(pre[x]);
	printf("%d ",v[x]);
}
int main(){
	int i,x,max=0,imax;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
//	s[1]=1;
	for(i=1;i<=n;i++){
		x=caut(v[i]);
		pre[i]=s[x-1];
		s[x]=i;
		if(x>c) c++;
		if(x>max){
			max=x;
			imax=i;
		}
	}
	printf("%d\n",max);
	afiseaza(imax);
	return 0;
}