Pagini recente » Cod sursa (job #3323339) | Cod sursa (job #3306138) | Cod sursa (job #3347904) | Cod sursa (job #3219749) | Cod sursa (job #581935)
Cod sursa(job #581935)
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011
using namespace std;
int v[N_MAX], l[N_MAX], idx[N_MAX], aib[N_MAX], f[N_MAX];
inline void Update( int x, const int& y, const int& N )
{
for( ; x <= N; x+=( x & -x ) )
if( l[aib[x]] < l[y] )
aib[x]=y;
}
inline int Query( int x )
{
int idx=0;
for( ; x; x-=( x & -x ) )
if( l[aib[x]] > l[idx] )
idx=aib[x];
return idx;
}
inline void Output( ostream& out, int x )
{
if( !x )
return;
Output( out, f[x] );
out<<v[x]<<' ';
}
int main( void )
{
int *end;
int N, i, j, lMaxIndex=0;
ifstream in( "scmax.in" );
in>>N;
copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
copy( v+1, v+N+1, l );
sort( l, l+N );
end=unique( l, l+N );
for( i=1; i <= N; ++i )
if( v[i] == v[i-1] )
idx[i]=idx[i-1];
else idx[i]=lower_bound( l, end, v[i] )-l+1;
l[0]=0;
for( i=1; i <= N; ++i )
{
j=Query( idx[i]-1 );
f[i]=j;
l[i]=1+l[j];
Update( idx[i], i, N );
if( l[i] > l[lMaxIndex] )
lMaxIndex=i;
}
ofstream out( "scmax.out" );
out<<l[lMaxIndex]<<'\n';
Output( out, lMaxIndex );
out<<'\n';
return EXIT_SUCCESS;
}