Cod sursa(job #1922268)

Utilizator DysKodeTurturica Razvan DysKode Data 10 martie 2017 16:46:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

#define f first
#define s second

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

pair<int,int> v[100010];
int i,j,n,m,parinte[100010],lungime[100010],arb[400010],init[100010],ans;

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

    if( left == right )
    {
        arb[ nod ] = val;
        return;
    }

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

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

void query( int nod, int left, int right, int L, int R )
{
    int middle = ( left + right ) / 2;

    if( right < L || left > R )
        return;
    if( L <= left && right <= R )
    {
        if( lungime[ arb[ nod ] ] > lungime[ ans ] )
            ans = arb[ nod ];
        return;
    }
    query( 2 * nod , left , middle , L , R );
    query( 2 * nod + 1 , middle + 1 , right , L , R );
}

void solve( int x )
{
    if( x == 0 )
        return;
    solve( parinte[ x ] );
    fout<<init[ x ]<<' ';
}

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

    for( i = 1 ; i <= n ; i++ )
    {
        ans = 0;
        query( 1 , 1 , n , 1 , -v[ i ].s );
        parinte[ -v[ i ].s ] = ans;
        lungime[ -v[ i ].s ] = lungime[ ans ] + 1;
        update( 1 , 1 , n , -v[ i ].s , -v[ i ].s );
    }

    for( i = 1 ; i <= n ; i++ )
        if( lungime[ i ] > lungime[ ans ] )
            ans = i;

    fout<<lungime[ ans ]<<'\n';
    solve( ans );


return 0;
}