Pagini recente » infoarena - comunitate informatica, concursuri de programare | Cod sursa (job #2303710) | Cod sursa (job #387180) | Cod sursa (job #1425710) | Cod sursa (job #2575270)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100000;
int nr, L[NMAX + 1], v[NMAX + 1], best[NMAX + 1], pred[NMAX + 1];
int bs( int x ) {
int r = 0;
int pas = 1<<29;
while( pas ) {
pas /= 2;
if( r + pas <= nr && v[L[r + pas]] < x )
r += pas;
}
return r;
}
void rec( int i ) {
if( i == 0 )
return ;
rec(pred[i]);
fout<<v[i]<<" ";
}
int main() {
int n;
fin>>n;
int maxim = 0, start = 0;
for( int i = 1; i <= n; i ++ ) {
fin>>v[i];
int poz = bs( v[i] );
pred[i] = L[poz];
best[i] = 1 + best[L[poz]];
L[poz + 1] = i;
if( poz + 1 > nr )
nr = poz + 1;
if( best[i] > maxim ) {
maxim = best[i];
start = i;
}
}
fout<<maxim<<"\n";
rec( start );
return 0;
}