Pagini recente » Statistici Hiticas Nicu (nicu) | Istoria paginii utilizator/beverita2345 | Profil maryan | Monitorul de evaluare | Cod sursa (job #478968)
Cod sursa(job #478968)
/*
* File: main.cpp
* Author: bitone
*
* Created on August 21, 2010, 1:10 PM
*/
#include <vector>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define MAX_N 100011
using namespace std;
/*
*
*/
typedef signed int sint;
typedef vector< sint >::iterator ivector;
sint N;
ivector it, iend;
vector< sint > v, w;
pair< ivector, ivector > p;
sint 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;
v.push_back(0);
copy( istream_iterator<sint>(in), istream_iterator<sint>(), back_inserter(v) );
w=v;
it=w.begin(), iend=w.end();
sort( it, iend );
iend=unique( it, iend );
for( i=1; 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;
}