Cod sursa(job #1173929)

Utilizator suzanicaSuzanica Mihu suzanica Data 21 aprilie 2014 12:15:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 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;

}