Cod sursa(job #1006383)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 6 octombrie 2013 22:11:19
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;

int N, best;
int V[Nmax], P[Nmax], Q[Nmax];

void read()
{
    freopen("scmax.in", "r", stdin);

    scanf("%d\n", &N);

    for ( int i = 1; i <= N; ++i )
            scanf("%d ", &V[i]);

    fclose( stdin );
}

int bin_search( int key )
{
    int st = 1, dr = best, found = -1;

    while ( st <= dr )
    {
        int m = st + ( dr - st ) / 2;

        if ( Q[m] == key )
        {
            return m;
        }

        if ( Q[m] > key )
        {
            found = m;
            dr = m - 1;
        }
        else
            st = m + 1;
    }

    return found;
}

void LIS()
{
    for ( int i = 1; i <= N; ++i )
    {
        int position = bin_search( V[i] );

        if ( position != -1 )
        {
            P[i] = position;
            Q[position] = V[i];
        }
        else
        {
            Q[ ++best ] = V[i];
            P[i] = i;
        }
    }
}

void print()
{
    freopen("scmax.out", "w", stdout);

    printf("%d\n", best);

    for ( int i = 1; i <= best; ++i )
            printf("%d ", Q[i]);
}

int main()
{
    read();
    LIS();
    print();

    return 0;
}