Cod sursa(job #228306)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 decembrie 2008 22:14:13
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>   
  
#define NMAX 100000
  
long n,i,x[NMAX],m[NMAX],p[NMAX],max,j;   
long q,t,sol[NMAX];   
  
int binary_search(long a, long b)
{   
    long ls=0,mij;   
    while (ls<a)
    {   
          mij=(ls+a)/2;   
          if (x[m[mij]]<b)   
             ls=mij+1;   
          else a=mij;   
    }   
  
return ls-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);   
  
    max=0;   
    m[0]=0;   
    for (i=1;i<=n;++i)
    {   
        j=binary_search(max+1,x[i]);   
        p[i]=m[j];   
        if (j==max || x[i] < x [m[j+1]])   
           m[j+1]=i;   
        if (max<j+1)
            max=j+1;   
    }   
    printf("%ld\n", max);   
    sol[1]=x[m[max]];   
    q=1;   
    t=m[max];   
    while (t)
    {   
          q++;   
          sol[q]=x[p[t]];   
          t=p[t];   
    }   
    for (i=max;i;--i)   
        printf("%ld ",sol[i]);   
    printf("\n");   
  
return 0;   
}