Pagini recente » Cod sursa (job #2081903) | Cod sursa (job #2424017) | Cod sursa (job #1713687) | Cod sursa (job #2034070) | Cod sursa (job #2539099)
#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 1e5;
int dp[NMAX]; /// Valoare minima a unui element pe care se termina un subsir de lungime i
int v[NMAX];
int cb( int st, int dr, int val ) {
int mij;
while ( st < dr - 1 ) {
mij = ( st + dr ) / 2;
if ( dp[mij] <= val )
st = mij;
else
dr = mij;
}
return st;
}
int main() {
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
int n, i, maxim, poz;
fin >> n;
for ( i = 0; i < n; i ++ ) {
fin >> v[i];
}
dp[1] = v[0];
maxim = 1;
for ( i = 1; i < n; i ++ ) {
poz = cb( 1, maxim + 1, v[i] );
///cout << dp[1];
if ( dp[poz] > v[i] )
dp[poz] = v[i];
else if ( dp[poz] < v[i] ) {
if ( poz == maxim ) {
dp[poz + 1] = v[i];
maxim ++;
} else
dp[poz + 1] = min( dp[poz + 1], v[i] );
}
}
fout << maxim << '\n';
for ( i = 1; i <= maxim; i ++ )
fout << dp[i] << ' ';
return 0;
}