Cod sursa(job #1915239)

Utilizator DysKodeTurturica Razvan DysKode Data 8 martie 2017 20:18:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 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,n,m,j,arb[400010],lungime[100010],precedent[100010],initial[100010],ans;

void update( int nod, int left, int right, int poz, int val )
{
    if( left == right )
    {
        arb[ nod ] = val;
        return;
    }

    int middle = ( left + right ) / 2;

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

void afisare( int x )
{
    if( x == 0 )
        return;
    afisare( precedent[ x ] );
    fout<<initial[ x ]<<' ';
}

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

    for( i = 1 ; i <= n ; i++ )
    {
        ans = 0;
        query( 1 , 1 , n , 1 , v[ i ].s );
        precedent[ v[ i ].s ] = ans;
        lungime[ v[ i ].s ] = lungime[ ans ] + 1;
        update( 1 , 1 , n , v[ i ].s , v[ i ].s );
    }
    ans = 1;
    for( i = 1 ; i <= n ; i++ )
    {
        if( lungime[ i ] > lungime[ ans ] )
            ans = i;
    }
    fout<<lungime[ ans ]<<'\n';
    afisare( ans );


return 0;
}