Pagini recente » Profil funkydvd | Cod sursa (job #1336792) | Urmasii lui Moisil 2015, Clasament Clasa a 10-a | Cod sursa (job #3244259) | Cod sursa (job #478965)
Cod sursa(job #478965)
/*
* File: main.cpp
* Author: bitone
*
* Created on August 21, 2010, 1:10 PM
*/
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define MAX_N 100011
using namespace std;
/*
*
*/
typedef signed int sint;
sint N;
sint *it, *iend;
pair< sint*, sint* > p;
sint v[MAX_N], w[MAX_N], f[MAX_N], l[MAX_N], aib[MAX_N];
void UpDate( sint x, sint y )
{
for( ; x <= N; x+=( x & -x ) )
aib[x]=( l[y] > l[aib[x]] ? y : aib[x] );
}
sint Query( sint x )
{
sint maxim=0;
for( ; x; x-=( x & -x ) )
maxim=( l[maxim] < l[aib[x]] ? aib[x] : maxim );
return maxim;
}
inline void Output( sint idx, ostream& out )
{
if( idx )
{
Output( f[idx], out );
out<<v[idx]<<'\n';
}
}
int main( void )
{
sint i, idx, maxim=0;
ifstream in( "scmax.in" );
in>>N;
copy( istream_iterator<sint>(in), istream_iterator<sint>(), v+1 );
memcpy( w, v, N*sizeof(sint) );
it=w+1, iend=w+N+1;
sort( it, iend );
iend=unique( it, iend );
l[1]=1;
for( i=2; i <= N; ++i )
{
p=equal_range( it, iend, v[i] );
idx=p.first-it+1;
f[i]=Query( idx-1 );
l[i]=1+l[f[i]];
UpDate( idx, i );
maxim=( l[i] > l[maxim] ? i : maxim );
}
ofstream out( "scmax.out" );
out<<l[maxim]<<'\n';
Output( maxim, out );
return EXIT_SUCCESS;
}