Pagini recente » Cod sursa (job #424408) | Cod sursa (job #1386886) | Cod sursa (job #2318855) | Cod sursa (job #3042149) | Cod sursa (job #672518)
Cod sursa(job #672518)
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011
using namespace std;
int v[N_MAX], w[N_MAX], idx[N_MAX], l[N_MAX], f[N_MAX], aib[N_MAX];
void Update( int N, int iIndex, int i )
{
for( int z=iIndex; z <= N; z+=z & -z )
if( l[aib[z]] < l[i] )
aib[z]=i;
}
int Query( int xIndex )
{
int mIndex=0;
for( ; xIndex; xIndex-=xIndex & -xIndex )
if( l[aib[xIndex]] > l[mIndex] )
mIndex=aib[xIndex];
return mIndex;
}
inline void Output( ostream& out, int& x )
{
if( !f[x] )
{
out<<v[x]<<' ';
}
else {
Output( out, f[x] );
out<<v[x]<<' ';
}
}
int main()
{
int N, i, mIndex=0;
ifstream in( "scmax.in" );
ofstream out( "scmax.out" );
in>>N;
copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
copy( v+1, v+N+1 , w+1 );
sort( w+1, w+N+1 );
for( i=1; i <= N; ++i )
idx[i]=lower_bound( w+1, w+N+1, v[i] )-w+1;
for( i=1; i <= N; ++i )
{
f[i]=Query( idx[i]-1 );
l[i]=1+l[f[i]];
Update( N, idx[i], i );
if( l[i] > l[mIndex] )
mIndex=i;
}
out<<l[mIndex]<<'\n';
Output( out, mIndex );
}