Pagini recente » Cod sursa (job #2866287) | Cod sursa (job #107756) | Cod sursa (job #123238) | Cod sursa (job #930912) | Cod sursa (job #2031763)
#include <fstream>
#define NMax 100005
using namespace std;
ofstream fout("scmax.out");
int v[NMax], N, p[NMax], L[NMax],best[NMax], nr;
void Citire()
{
ifstream fin("scmax.in");
fin >> N;
for ( int i = 1 ; i <= N ; ++i )
fin >> v[i];
fin.close();
L[0] = 0;
L[1] = best[1] = 1;
nr = 1;
}
void Afisare( int i )
{
if ( p[i] > 0 )
Afisare( p[i] );
fout << v[i] << " ";
}
int Cautare( int x )
{
int prim = 0;
int ultim = nr;
int mij = ( prim + ultim ) / 2;
while ( prim <= ultim )
{
if ( v[L[mij]] < x && v[L[mij + 1]] >= x )
return mij;
else
if ( v[L[mij + 1]] < x )
{
prim = mij + 1;
mij = ( prim + ultim ) / 2;
}
else
{
ultim = mij - 1;
mij = ( prim + ultim ) / 2;
}
}
return nr;
}
int main()
{
Citire();
int poz;
for ( int i = 2 ; i <= N ; ++i )
{
poz = Cautare( v[i] );
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if ( nr < poz + 1 )
nr = poz + 1;
}
int maxim = 0;
poz = 0;
for ( int i = 1 ; i <= N ; ++i )
if ( maxim <= best[i] )
{
maxim = best[i];
poz = i;
}
fout << maxim << '\n';
Afisare( poz );
return 0;
}