Cod sursa(job #2609705)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 3 mai 2020 11:12:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define lll long long
#define fi first
#define rest se.fi
#define suma se.se
#define sir first
#define se second

using namespace std;

const lll NR = 2e5 + 10 , oo = 2e9 + 100  ;



void boost ()    {
    #ifndef ONLINE_JUDGE
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    #endif
     ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}

int dp [ NR ] , n , maxind , pos [ NR ] , last [ NR ] , a [ NR ] ;

void rec ( int x )  {
    if ( !x ) return ;
    rec ( last [ x ] ) ;
     cout << a [ x ] << ' ' ;
}

int main()  {
    int i , j , x , y , jj , st , dr , mij , sol ;
    boost() ;
    cin >> n ;
    dp [ 0 ] = 0 ;

    for ( i = 1 ; i <= n ; ++ i  )
        dp [ i ] = oo ;
    for ( i = 1 ; i <= n ; ++ i )   {
        cin >> a [ i ] ;
        x = a [ i ] ;
        st = 1 ; dr = n ; sol = 0 ;
        while ( st <= dr )  {
            mij = ( st + dr ) >> 1 ;
            if ( dp [ mij ] < x )   {
                sol = mij ;
                st = mij + 1 ;
            }   else    {
                dr = mij - 1 ;
            }
        }
        if ( x < dp [ sol + 1 ] )   {
            dp [ sol + 1 ] = x ;
            pos [ sol + 1 ] = i ;
            last [ i ] = pos [ sol ] ;
        }
        maxind = max ( maxind , sol + 1 ) ;
    }
        cout << maxind << '\n' ;

    rec ( pos [ maxind ] ) ;

    return 0;
}