Pagini recente » Cod sursa (job #1968575) | Cod sursa (job #1317940) | Cod sursa (job #1102154) | Cod sursa (job #495643) | Cod sursa (job #2628010)
#include <stdio.h>
int d[100001];
int poz[100001];
int prev[100001];
int v[100001];
int aux[100001];
int cautbin( int n, int e ) {
int st = 0, dr = n, mij;
while ( dr - st > 1 ) {
mij = (st + dr) / 2;
if ( d[mij] > e ) {
dr = mij;
} else {
st = mij;
}
}
return st;
}
int main() {
FILE *fin = fopen( "scmax.in", "r" );
FILE *fout = fopen( "scmax.out", "w" );
int n, i, a, len, pos, j, ant, l;
fscanf( fin, "%d%d", &n, &a );
len = 0;
v[0] = a;
poz[len] = 0;
d[len++] = a;
for ( i = 1; i < n; ++i ) {
fscanf( fin, "%d", &a );
v[i] = a;
if ( a > d[len - 1] ) {
prev[i] = poz[len - 1];
poz[len] = i;
d[len++] = a;
} else {
pos = cautbin( len, a );
if ( d[pos] < a ) {
++pos;
}
d[pos] = a;
poz[pos] = i;
if ( pos >= 1 ) {
prev[i] = poz[pos - 1];
}
}
}
fprintf( fout, "%d\n", len );
i = poz[len - 1];
l = 0;
while ( l < len ) {
aux[l] = v[i];
++l;
i = prev[i];
}
for ( i = len - 1; i >= 0; --i ) {
fprintf( fout, "%d ", aux[i] );
}
fclose( fin );
fclose( fout );
return 0;
}