Cod sursa(job #175746)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 10 aprilie 2008 12:54:11
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <math.h>
#define FIN "scmax.in"
#define FOUT "scmax.out"

int n,t;

int *read_data(int &n)
{
    freopen( FIN , "r" , stdin );
    scanf ( "%d" , &n );
    int *S=new int[n];
    for ( int i=0 ; i<n ; i++ ) scanf ("%d" , &S[i] );
    fclose( stdin );
    return S;
}

int write_data ( int *T )
{
    freopen ( FOUT , "w" , stdout );
    printf ( "%d\n" , ++t );
    for ( int i=0 ; i<t ; i++ )
        printf ( (i<t-1)?"%d ":"%d\n" , T[i] );
    fclose ( stdout );
    return 0;
}

int search ( int v , int *T , int n )
{
    int pas,poz=0;
    pas = 1<<(int)log(n);
    while (pas)
    {
        while ( pas && T[poz+pas]>v ) pas>>=1;
        poz+=pas;
    }
}

int *solve ( int *S )
{
    int *T=new int[n];
    int *V=new int [n];
    int v=-1,max,p,i;
    for ( i=0,t=-1 ; i<n ; i++ )
    {
        if ( t<0 || S[i]>T[t] ) T[v=++t]=S[i]; else
            T[v=search(S[i],T,t)] = S[i];
        V[i]=v;
        if (v>max) max=v,p=i;
    }
    T[max]=S[p];
    for ( v=max-1 , i=p-1 ; i+1 ; i-- )
        if ((T[v+1]>S[i])&&(V[i]+1==V[p]))
            T[v--]=S[p=i];
    t=max;
    return T;
}

int main ()
{
    return write_data( solve( read_data(n) ) );
}