#include <stdio.h>
#include <stdlib.h>
int dr = 1;
//int best[1000] = {0};
void citire( int *n, int **vector)
{
int i, j;
int *sir;
FILE *f = fopen( "scmax.in","rt");
if( f == NULL){
printf( "Fisierul nu poate fi deschis!!!");
exit(0);
}
fscanf(f, "%i", n);
//printf("{este%i}\n",*n);
sir = (int*)calloc(*n+1, sizeof(int));
for( i = 1; i <= *n; i++)
fscanf(f,"%i", &sir[i]);
*vector = sir;
fclose( f);
return;
}
void afisare(int n, int *vector)
{
int i;
printf("\n");
for( i = 0; i < n; i++)
printf(" %i", vector[i]);
return;
}
int cauta( int curent, int n, int *vector, int *L, int* p)
{
int i = 1, j, dr_temp = dr;
int st = 1,mij = 1, m_mare = -1;
//metoda de cautare binara
//printf("\ncurent:%i,vector[curent]:%i, dr:%i, vector[L[dr]]:%i\n",curent, vector[curent],dr, vector[L[dr]]);
//
// if(vector[curent] > vector[L[dr]])
// mij = dr;
// else
do
{
m_mare = 0;
mij = (st+dr_temp)/2;
//printf("\ncurent:%i,vector[curent]:%i, mij:%i, vector[L[mij]]:%i\n",curent, vector[curent],mij, vector[L[mij]]);
if(vector[curent]<vector[L[mij]]){
//printf("mai mic");
dr_temp = mij-1;
}
else
if(vector[curent]==vector[L[mij]]){
//printf("egal");
break;
}
else{
//printf("mai mare");
m_mare = 1;
st = mij+1;
}
//getch();
}while(st<=dr_temp);
//printf("\ndr: %i", dr);
/* if(m_mare == -1){
//printf("intra aici");
(++dr);
return dr;
}
if(m_mare == 1){
//printf("intra aici");
dr_temp = (++mij);
return mij;
}
*/ //printf("\ni_ret= %i ",mij);
return mij;
}
int afis_rec( int poz, int *vector, int *p, FILE *f)
{
//printf( " poz: %i", poz);
//getch();
if( poz != 0){
afis_rec( p[poz], vector, p, f);
fprintf( f, " %i", vector[poz]);
}
return 1;
}
int main()
{
int i, j, n, m, curent, max = 0;
int *vector, *p, *L, poz = 0, *best;
FILE *f = fopen( "scmax.out", "wt");
citire( &n, &vector);
p = (int*)calloc(n + 1, sizeof(int));//de cine se leaga
best = (int*)calloc(n + 1, sizeof(int));//cel mai lung subsir crescator
L = (int*)calloc(n + 1, sizeof(int));//cel mai recent numar de lungime i
best[1] = 1;
curent = 2;
L[1] = 1;L[2]=1;
while( curent <= n){
//caut elementul curent
poz = cauta(curent, n, vector, L, p);
L[poz] = curent;
p[curent] = L[poz - 1];
//max = best[1];
//for(i = 1; i < curent; i++)
// printf("best: %i", best[i]);
//if(best[i] > max) max = best[i];
best[curent] = poz;
//printf("\nL:");
//for(j=1;j<=dr;j++)
// printf(" %i->%i",j,L[j]);
curent++;
}
//afisare( n + 1, vector);
//afisare( n + 1, p);
//afisare( n + 1, best);
//afisare( n + 1, L);
max = best[1]; poz = 1;
for(i = 2; i < curent; i++)
if(best[i] > max){ max = best[i]; poz = i;}
//printf("\n poz: %i, max: %i \n",poz,max);
fprintf( f, "%i\n", max);
afis_rec( poz, vector, p, f);
fclose( f);
return 0;
}