Pagini recente » Cod sursa (job #2185178) | Cod sursa (job #3132291) | Cod sursa (job #2986504) | Cod sursa (job #1943993) | Cod sursa (job #1368643)
#include <fstream>
using namespace std;
const int NMAX= 100000;
ifstream in ( "scmax.in" );
ofstream out( "scmax.out" );
int v[NMAX+1], d[NMAX+1], r[NMAX+1], ans[NMAX+1];
int k, maxim, poz, N, nr;
int find_sol( int x )
{
int l= 0, r= nr, mid= ( l+r )/2;
while( l <= r )
{
if ( v[ ans[mid] ] < x && v[ ans[mid+1] ] >= x )
{
return mid;
}
else if ( v[ ans[mid+1] ] < x )
{
l = mid + 1;
mid = ( l + r )/2;
}
else
{
r = mid - 1;
mid = ( l + r )/2;
}
}
return nr;
}
void get_sol( int x )
{
if( r[x] > 0 ) get_sol( r[x] );
out << v[x] << ' ';
}
int main()
{
in >> N;
for( int i= 1; i <= N; ++i )
{
in >> v[i];
}
d[1] = ans[1] = 1;
ans[0] = 0;
nr = 1;
for( int i= 2; i <= N; ++i )
{
poz = find_sol( v[i] );
r[i] = ans[poz];
d[i] = poz + 1;
ans[poz + 1] = i;
if( nr < poz + 1 )
{
nr= poz + 1;
}
}
for( int i= 1; i<= N; ++i ){
if( maxim < d[i] )
{
maxim = d[i];
poz = i;
}
}
out << maxim << '\n';
get_sol(poz);
return 0;
}