Cod sursa(job #2616589)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 18 mai 2020 23:27:40
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream r( "scmax.in" );
ofstream w( "scmax.out" );
int v[ 200001 ], poz[ 200001 ];
int dinamica[ 200001 ], cnt[ 200001 ];
int cautbin(int x, int dr);

int main()
{
    int n = 0, b = 0, lungime = 0, maxim = 0, maxim2;
    r >> n;
    for( int i = 0; i < n; i++ )
        r >> v[ i ];
    for(int i = 0; i < n; i++ ){
        b = cautbin( v[i], lungime );
        lungime = max( lungime, b + 1 );
        dinamica[ i ] = b + 1;
        poz[ dinamica[ i ] ] = i;
        maxim = max( maxim, dinamica[ i ] );
    }
    maxim2 = maxim;
    w << maxim <<"\n";
    for(int i = n - 1; i >= 0; i-- ){
        if( maxim2 == dinamica[ i ] ) {
            cnt[ maxim2 ] = v[ i ];
            maxim2--;
        }
    }
    for(int i = 1; i <= maxim; i++ )
        w << cnt[ i ] << " ";
    return 0;
}

int cautbin(int x, int dr){
    int st = 1, p = 0, mij;
    while( st <= dr ){
        mij = ( st + dr ) / 2;
        if( v[ poz [ mij ] ] < x ){
            p = mij;
            st = mij + 1;
        } else dr = mij - 1;
    }
    return p;
}