Pagini recente » Cod sursa (job #1663971) | Cod sursa (job #825879) | Cod sursa (job #2743085) | Cod sursa (job #826968) | Cod sursa (job #2692392)
#include <stdio.h>
#include <ctype.h>
#define MAXN 100000
FILE *fin, *fout;
int num[MAXN];
int aux[MAXN + 1];// santinela la sfarsit
int pos[MAXN];
int elem[MAXN];
static inline int fgetint(){
int n = 0, ch;
while( !isdigit(ch = fgetc(fin)) );
do
n = n * 10 + ch - '0';
while( isdigit(ch = fgetc(fin)) );
return n;
}
static inline void fputint( int n, int term ){
int i = 10;
char out[] = "0000000000?";
out[i] = term;
if( n == 0 ){
fputs(out + (i - 1), fout);
return;
}
while( n ){
out[--i] = n % 10 + '0';
n /= 10;
}
fputs(out + i, fout);
}
int main(){
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
int n, laux, i, st, dr, mij, val;
n = fgetint();
aux[0] = num[0] = fgetint();
pos[0] = 0;
laux = 1;
for( i = 1 ; i < n ; i++ ){
num[i] = fgetint();
st = -1;
dr = n - 1;
aux[laux] = 2000000001;// santinela
while( dr - st > 1 ){
if( aux[mij = (st + dr) / 2] < num[i] )
st = mij;
else
dr = mij;
}
laux = (dr + 1) > laux ? (dr + 1) : laux;
pos[i] = dr;
aux[dr] = num[i];
}
fputint(laux, '\n');
// gasim elementele
val = laux - 1;
i = n - 1;
while( val >= 0 ){
if( pos[i] == val )
elem[val--] = num[i];
i--;
}
for( i = 0 ; i < laux ; i++ )
fputint(elem[i], ' ');
fputc('\n', fout);
fclose(fin);
fclose(fout);
return 0;
}