Mai intai trebuie sa te autentifici.

Cod sursa(job #3287944)

Utilizator pacelaaaCiurea Pavel pacelaaa Data 19 martie 2025 23:49:43
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

ifstream cin ( "scmax.in" );
ofstream cout ( "scmax.out" );

#define FR( a, b ) for( int a = 0; a < b; a ++ )
#define FOR( a, c, b) for( int a = c;  a< b; a ++ )

const int Nmax = 2e5 + 5;

int a[Nmax], previous[Nmax], final_minim[Nmax];

int main()
{
    int n, lmax, l, r, mij;

    cin >> n;
    FOR( i, 1, n + 1 )
      cin >> a[i];

    final_minim[1] = 1;
    previous[1] = 0;
    lmax = 1;

    FOR( i, 2, n + 1 ) {
      l = 0;
      r = lmax + 1;
      while( l < r - 1 ) {
        mij = ( l+r ) / 2;
        if( a[i] > a[final_minim[mij]] )
          l = mij;
        else
          r = mij;
      }
      if( r == lmax + 1 ) {
        final_minim[ lmax + 1 ] = i;
        previous[i] = final_minim[lmax];
        lmax++;
      }
      else {
        final_minim[r] = i;
        previous[i] = final_minim[r-1];
      }
    }

    cout << lmax << '\n';


    int poz_crt = final_minim[lmax];
    final_minim[1] = a[ final_minim[lmax] ];
    FOR( i, 2, lmax + 1) {
      poz_crt = previous[poz_crt];
      final_minim[i] = a[poz_crt];
    }
    for( int i = lmax; i >= 1; i -- )
      cout << final_minim[i] << " ";

    return 0;

}