Cod sursa(job #183033)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 21 aprilie 2008 17:26:30
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <math.h>
#define FI "scmax.in"
#define FO "scmax.out"
#define INF 0x3f3f3f3f
#define MAXN 100001

int N[MAXN],T[MAXN],V[MAXN],n;

void read_data()
{
    freopen ( FI , "r" , stdin );
    scanf ( "%d" , &n );
    for ( int i=0 ; i<n ; i++ ) scanf ( "%d" , &N[i] );
    fclose ( stdin );
}

void write_data(int t)
{
    int v;
    freopen ( FO , "w" , stdout );
    printf ( "%d\n" , t );N[n]=INF;
    for ( V[v=t]=INF ; t ; V[--t] = N[n] )
        while ( T[n]+1 != t || N[n] >= V[t] )
          n--;
    for ( t=0 ; t<v ; t++ )
        printf ( (t+1<v)?"%d ":"%d\n" , V[t] );
    fclose ( stdout );
}

int search ( int x ,int max )
{
    int p,pas = (int) log2(max);
    for ( p=0 ; pas ; pas>>=1 )
    {
        while ( pas && V[p+pas]>x ) pas>>=1;
        p+=pas;
    }
    return p;
}

void solve()
{
    int i,p,max;
    for ( V[max=0]=N[0],i=1 ; i<n ; i++ )
    {
        if (V[max]<N[i]) V[T[i]=++max]=N[i]; else
            V[T[i]=search(N[i],max+1)] = N[i];
    }
    write_data(max+1);
}

int main()
{
    read_data();
    solve();
    return 0;
}