Cod sursa(job #183413)

Utilizator nimeniaPaul Grigoras nimenia Data 22 aprilie 2008 08:18:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>

const int NMAX=100010;

int v[NMAX],n,S[NMAX],L[NMAX],lS,sol[NMAX],nsol=1;

int caut(int a,int l){
    int li=1,ls=l,m;
    m=(li+ls)/2;
    while (li<ls){
          if (S[m]<a) li=m+1,m=(li+ls)/2;
          else if (S[m]>a) ls=m-1,m=(li+ls)/2;
          else if (S[m]==a) return m;
         }
    return m;


}

int main(){
    int i,poz;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%d",&n);
    for (i=1;i<=n;i++){
        scanf("%d",&v[i]);
        poz=caut(v[i],lS);
        if (S[poz]<v[i]) poz++;
        S[poz]=v[i],L[i]=poz; 
        if (poz>lS) lS=poz;
    }
    
    int nmax=lS,v_ant=2000000001;
    for (i=n;i>=1;i--)
        if (L[i]==nmax && v[i]<v_ant) sol[nsol++]=v[i],nmax--,v_ant=v[i];
    
    printf("%d\n", lS);
    for(i=nsol-1;i>=1;i--) printf("%d ",sol[i]);
                      
    
    return 0;

}