Mai intai trebuie sa te autentifici.
Cod sursa(job #3287944)
Utilizator | 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;
}