Cod sursa(job #203821)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 20 august 2008 10:21:53
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <stdio.h>
#define N 100004
int v[N],pre[N],L[N],c=1;

int caut(int x){
	int st=1,dr=c,m;
	if(v[L[dr]]>=x) return dr;
	else return dr+1;
	while(st<dr){
		m=(st+dr)>>1;
		if(v[L[m]]==x) return m;
		if(v[L[m]]<x) dr=m-1;
		else st=m+1;
	}
	return st;
}
void afiseaza(int x){
	if(pre[x]>0) 
		afiseaza(pre[x]);
	printf("%d ",v[x]);
}
int main(){
	int i,poz,max=0,imax,n;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	L[1]=1;
	for(i=2;i<=n;i++){
		poz=caut(v[i]);
		pre[i]=L[poz-1];
		L[poz]=i;
		if(poz==c+1) c++;
		if(poz>max) {
			max=poz;
			imax=i;
		}
	}
	printf("%d\n",max);
	afiseaza(imax);
}