Cod sursa(job #1711123)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 30 mai 2016 16:44:29
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define MAX 100003

using namespace std;

int v[MAX], b[MAX], p[MAX], l[MAX];
int n, nr;

void read();
void solve();
int srch(int x);
void print(int i);

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

void read()
{
    freopen ( "scmax.in", "r", stdin );
    scanf ( "%d", &n );
    for ( int i = 1; i <= n; ++i )
        scanf ( "%d", &v[i] );
    fclose(stdout);
}

void solve()
{
    freopen ( "scmax.out", "w", stdout );
    int poz, m;
    b[1] = l[1] = 1, l[0] = 0;
    for ( int i = 2; i <= n; ++i )
    {
        poz = srch(v[i]);
        p[i] = l[poz];
        b[i] = poz + 1;
        l[poz + 1] = i;
        if ( nr < poz + 1 )
            nr = poz + 1;
    }
    m = 0, poz = 0;
    for ( int i = 1; i <= n; ++i )
        if ( m < b[i] )
            m = b[i], poz = i;
    printf ( "%d\n", m );
    print(poz);
    fclose(stdout);
}

int srch(int x)
{
    int p(0), u(nr), m = (p+u) >> 1;
    while (p <= u)
    {
        if ( v[l[m]] < x && v[l[m+1]] >= x )
            return m;
        else if ( v[l[m+1]] < x )
            p = m + 1, m = (p + u) >> 1;
        else u = m - 1, m = (p + u) >> 1;
    }
    return nr;
}

void print(int i)
{
    if ( p[i] > 0 )
        print(p[i]);
    printf ( "%d ", v[i] );
}