Cod sursa(job #202494)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 9 august 2008 09:37:49
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>

#define NMAX 100000

int n,a[NMAX+1];
int l[NMAX+1],next[NMAX+1],max[NMAX*3];

void upd(int nod){
int i=1,j=n,k=1,mij;
while(i<=j){
	if(i==j){
		max[k]=nod;
		k/=2;
		while(k){
			if(l[max[2*k]]>l[max[2*k+1]]) max[k]=max[2*k];
			else max[k]=max[2*k+1];
			k/=2;
			}
		break;
		}
	else{
		mij=(i+j)/2;
		if(nod<=mij) {k=2*k;j=mij;}
		else {k=2*k+1;i=mij+1;}
		}
	}
}

void qry(int nod,int st,int dr,int ls,int &m){
int mij,mst,mdr;
if(1<=st&&dr<=ls){
	m=max[nod];
	}
else{
	mij=(st+dr)/2;
	if(1<=mij) qry(2*nod,st,mij,ls,mst);
	if(mij<ls) qry(2*nod+1,mij+1,dr,ls,mdr);
	if(l[mst]>l[mdr]) m=mst;
	else m=mdr;
	}
}

int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i,j,lmax,best,maxim,first;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
l[n]=1;upd(n);
for(i=n-1;i>0;i--){
	qry(1,1,n,n,best);
	if(a[i]<a[best]) l[i]=1+l[best];
	else l[i]=l[best];
	next[i]=best;
	upd(i);
	}
lmax=0;first=0;
for(i=1;i<=n;i++)
	if(l[i]>lmax) {lmax=l[i];first=i;}
printf("%d\n",lmax);
i=first;
while(next[i]!=0){
	printf("%d ",a[i]);
	i=next[i];
	}
printf("%d",a[i]);
return 0;
}