Pagini recente » Cod sursa (job #3036494) | Cod sursa (job #3033496) | Cod sursa (job #1059573) | Cod sursa (job #2444694) | Cod sursa (job #2690520)
#include <fstream>
using namespace std;
const int NMAX = 1e6;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[NMAX + 1], dp[NMAX + 1], last[NMAX + 1];
int cb ( int x, int n ) {
int pos = 0, pas = (1 << 16);
for ( ;pas; pas >>= 1)
if ( pos + pas <= n && v[ dp[pos + pas] ] < x )
pos += pas;
return pos + 1;
}
void Write_sol ( int n ) {
if( n != 0 ) {
Write_sol( last[n] );
fout << v[n] << ' ';
}
}
int main() {
int n, i, cate, poz;
fin >> n;
for ( i = 1; i <= n; i++ )
fin >> v[i];
dp[cate = 1] = 1;
for ( i = 2; i <= n; i++ ) {
poz = cb(v[i], cate);
if ( poz == cate + 1 )
cate++;
dp[poz] = i;
if ( poz == 1 )
last[i] = 0;
else
last[i] = dp[poz - 1];
}
fout << cate << '\n';
Write_sol ( dp[cate] );
return 0;
}