Cod sursa(job #357461)

Utilizator PointerTalpasanu Aurelian Pointer Data 19 octombrie 2009 12:47:26
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#define N 1<<17
int n,v[N],val[N],r,best[N],ant[N],poz_f,rez_f;
int cbin(int x){
	int i,j;
	for (j=1; j<=r; j<<=1);
		for (i=0; j; j>>=1)
			if (i+<=r && v[val[i+j]]<x)
				i+=;
	return ++i;
}
void afisare(int poz){
    if (ant[poz]>0)
        afisare(ant[poz]);
    printf("%d ",v[poz]);
}
int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
	scanf("%d",&n);
    int i,poz;
    scanf("%d",&v[1]);
	val[++r]=1;
    best[1]=1;
    for (i=2; i<=n; i++){
        scanf("%d",&v[i]);
        poz=r+1;
        if (v[i]>v[val[r]])
           val[++r]=i;
        else{
           poz=cbin(v[i]);
            val[poz]=i;
		}
        best[i]=poz;
		if (best[i]>rez_f){
			rez_f=best[i];
			poz_f=i;
		}
		ant[i]=val[poz-1];
	}
	printf("%d\n",r);
	afisare(poz_f);
	return 0;
}