Cod sursa(job #602227)

Utilizator szabibibiOrban Szabolcs szabibibi Data 9 iulie 2011 22:01:22
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>


long n, a[100001], os[100001], minPosL[100001], L;



void Binarizal(long e, long v, long i, long *j)
{
     long k;
     *j = 0;
     while (e<=v)
     {
           k = (e+v)/2;
           
           if (a[minPosL[k]]<a[i])
           {
              *j = k;
              e = k+1;
           }
           else v = k-1;
     }
}


void Megold()
{
     L = 0;
     long j = 0, i;
     
     for (i=1; i<=n; i++)
     {
         Binarizal(1, L, i, &j);
         
         os[i] = minPosL[j];         
         if (j==L || a[i] < a[minPosL[j+1]])
         {
                  minPosL[j+1] = i;
                  L = (L<j+1)?(j+1):L;
         }
     } 
}


void Kiir(int k)
{
     if (k==0) return;
     Kiir(os[k]);
     printf("%ld ", a[k]);
}

int main()
{
    long i;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%ld", &n);
    for (i=1; i<=n; i++)
            scanf("%ld", a+i);
            
    Megold();
    
    printf("%ld\n", L);
    Kiir(minPosL[L]);
    return 0;
}