Cod sursa(job #1543751)

Utilizator DysKodeTurturica Razvan DysKode Data 6 decembrie 2015 11:39:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

#define DIM 100010
#define f first
#define s second

int v[DIM],sol[DIM],i,j,n,m,l,lun,st,p;
pair<int,int>norm[DIM];
pair<int,int>arb[4*DIM];

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

    if( left > lim )
        return;

    if( right <= lim )
    {
        if( arb[ nod ].f > lung )
        {
            lung = arb[ nod ].f;
            poz = arb[ nod ].s;
        }
        return;
    }

    query( 2 * nod , left , middle , lim , lung , poz );
    if( lim > middle )
        query( 2 * nod + 1 , middle + 1 , right , lim , lung , poz );

}

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

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

    if( poz <= middle )
        update( 2 * nod , left , middle , poz , valA , valB );
    else
        update( 2 * nod + 1 , middle + 1 , right , poz , valA , valB );

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

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

int main()
{
    fin>>n;
    for( i = 1 ; i <= n ; i++ )
    {
        fin>>v[ i ];
        norm[ i ] = make_pair( v[ i ] , i );
    }

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

    for( i = 1 ; i <= n ; i++ )
    {
        l = p = 0;
        query( 1 , 1 , n , norm[ i ].s - 1 , l , p );
        l++;
        sol[ norm[ i ].s ] = norm[ p ].s;
        if( l >= lun )
            st = norm[i].s,lun = l;
        update( 1 , 1 , n , norm[ i ].s , l , i );
    }

    l = lun;
    while( st != 0 )
    {
        norm[ l-- ].f = v[ st ];
        st = sol[ st ];
    }

    fout<<lun<<'\n';
    for( i = 1 ; i <= lun ; i++ )
        fout<<norm[ i ].f<<' ';

return 0;
}