Cod sursa(job #174934)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 9 aprilie 2008 13:22:05
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
//Cel mai lung subsir crescator in N * log N

#include <stdio.h>

long n,i,x[100005],m[100005],p[100005],L,j;
long q,t,sol[100005];

int bSearch(long high,long val){
    long low=0,mid;
    while (low<high){
          mid=(low+high)/2;
          if (x[m[mid]]<val)
             low=mid+1;
          else high=mid;
    }

return low-1;
}

int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%ld",&n);
    for (i=1;i<=n;i++)
        scanf("%ld",&x[i]);

    L=0;
    m[0]=0;
    for (i=1;i<=n;i++){
        j=bSearch(L+1,x[i]);
        p[i]=m[j];
        if (j==L || x[i] < x [m[j+1]])
           m[j+1]=i;
        if (L<j+1)L=j+1;
    }
    printf("%ld\n",L);
    sol[1]=x[m[L]];
    q=1;
    t=m[L];
    while (t){
          q++;
          sol[q]=x[p[t]];
          t=p[t];
    }
    for (i=L;i;i--)
        printf("%ld ",sol[i]);
    printf("\n");

return 0;
}