Pagini recente » Cod sursa (job #2810860) | Cod sursa (job #219285) | Cod sursa (job #2464821) | Cod sursa (job #1811273) | Cod sursa (job #2539095)
#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 1e5;
int dp[NMAX]; /// lungimea scmax care se termina pe pozitia 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 ++;
else
dr ++;
}
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] );
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;
}