Cod sursa(job #2297927)

Utilizator Turturica_DorinTurturica Dorin Turturica_Dorin Data 6 decembrie 2018 20:11:10
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

#define nmax 100005

int n, m, logn, maxi, i, v[ nmax ], sub[ nmax ], poz[ nmax ], p, ln, k;

void tipar( int i )
{
    if ( i != 0 && k != 0 )
    {
        if ( poz[ i ] == k )
        {
            k--;
            tipar( i - 1 );
            fout<< v[ i ] << ' ';
        }
        else
        {
            tipar( i - 1 );
        }
    }
}

int caut_bin( int val )
{
    int i;
    if ( logn < m )
        logn <<= 1;
    for ( i = m, ln = logn; ln; ln >>= 1 )
    {
        if ( i - ln > 0 && val <= sub[ i - ln ] )
            i -= ln;
    }
    return i;
}

int main()
{
    fin >> n;
    m = 1;
    logn = 1;
    maxi = 1;
    for ( i = 1; i <= n; i++ )
    {
        fin >> v[ i ];
        sub[ i ] = ( ( 1 << 30 ) - 1 ) * 2;
        p = caut_bin( v[ i ] );
        if ( v[ i ] < sub[ p ] )
        {
            sub[ p ] = v[ i ];
            poz[ i ] = p;
        }
        else if ( v[ i ] > sub[ p ] )
        {
            m++;
            sub[ p + 1 ] = v[ i ];
            poz[ i ] = p + 1;
            maxi = i;
        }
    }
    k = poz[ maxi ];
    fout<< k << '\n';
    tipar( maxi );
    return 0;
}