Pagini recente » Cod sursa (job #3168751) | Cod sursa (job #2987850) | Cod sursa (job #1385924) | Cod sursa (job #2854598) | Cod sursa (job #2246787)
#include <fstream>
#define maxn 100000
using namespace std;
int v[maxn+5];
int cap[maxn+5]; /// indice numar capat dreapta lungime sir []
int ult[maxn+5];
ifstream fin ( "scmax.in" );
ofstream fout ( "scmax.out" );
int cbin ( int _m, int val )
{
int pas = 1, i = 1;
while ( pas <= _m )
pas *= 2;
while ( pas > 0 )
{
if ( i + pas <= _m && v[cap[i+pas]] < val )
i += pas;
pas /= 2;
}
if ( i > 1 || v[cap[1]] < val )
return i;
return 0;
}
void subsir ( int p )
{
if ( ult[p] != 0 )
subsir ( ult[p] );
fout << v[p] << ' ';
}
int main ()
{
int n;
fin >> n;
int i;
for ( i = 1; i <= n; i++ )
{
fin >> v[i];
cap[i] = INT_MAX;
}
int _m = 1, j;
cap[1] = 1;
ult[1] = 1;
for ( i = 2; i <= n; i++ )
{
j = cbin ( _m, v[i] );
cap[j+1] = i;
ult[i] = cap[j];
if ( j == _m )
_m++;
}
fout << _m << '\n';
subsir ( cap[_m] );
fin.close ();
fout.close ();
return 0;
}