Cod sursa(job #1600492)

Utilizator DysKodeTurturica Razvan DysKode Data 15 februarie 2016 08:53:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

#define f first
#define s second

pair<int,int> v[100001],arb[400000];
int i,j,n,m,sol[100001],lng,lngMax,startPos,pos,ans[1000001];

bool cmp( pair<int,int> a, pair<int,int> b )
{
    if( a.f != b.f )
        return a.f<b.f;
    else
        return a.s>b.s;
}

void query( int nod, int left, int right, int ld, int &lung, int &poz )
{
    int middle = ( left + right ) / 2;

    if( left > middle )
        return;

    if( right <= ld )
    {
        if( arb[ nod ].f > lung )
        {
            lung = arb[ nod ].f;
            poz = arb[ nod ].s;
        }
        return;
    }
    query( 2 * nod , left , middle , ld , lung , poz );
    if( middle + 1 <= ld )
        query( 2 * nod + 1 , middle + 1 , right , ld , lung , poz );

}

void update( int nod, int left, int right, int poz, int val, int ln )
{
    int middle = ( left + right ) / 2;

    if( left == right )
    {
        arb[ nod ].f = ln;
        arb[ nod ].s = val;
        return;
    }

    if( middle >= poz )
        update( 2 * nod , left , middle , poz , val , ln );
    else
        update( 2 * nod + 1 , middle + 1 , right , poz , val , ln );

    if( arb[ 2 * nod ] > arb[ 2 * nod + 1 ] )
        arb[ nod ] = arb[ 2 * nod ];
    else
        arb[ nod ] = arb[ 2 * nod + 1 ];
}

int main()
{
    fin>>n;
    for( i = 1 ; i <= n ; i++ )
    {
        fin>>v[ i ].f;
        v[ i ].s = i;
    }


    sort( v + 1 , v + n + 1 , cmp );

    for( i = 1 ; i <= n ; i++ )
    {
        lng = 0;
        pos = 0;
        query( 1 , 1 , n , v[ i ].s , lng , pos );
        lng++;
        if( lng > lngMax )
        {
            lngMax = lng;
            startPos = i;
        }
        sol[ i ] = pos;
        update( 1 , 1 , n , v[ i ].s , i , lng );
    }

    fout<<lngMax<<'\n';
    pos = 1;
    while( startPos != 0 )
    {
        ans[ pos++ ] = v[ startPos ].f;
        startPos = sol[ startPos ];
    }
    for( i = lngMax ; i >= 1 ; i-- )
        fout<<ans[ i ]<<' ';

return 0;
}