Pagini recente » Cod sursa (job #3290184) | Profil BlackNesta | Cod sursa (job #3300029) | Cod sursa (job #2553889) | Cod sursa (job #478970)
Cod sursa(job #478970)
/*
* 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], idx[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, 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 );
for( i=1; i <= N; ++i )
if( w[i] != w[i-1] )
{
p=equal_range( it, iend, v[i] );
idx[i]=p.first-it+1;
}
else idx[i]=idx[i-1];
// 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[i]-1 );
l[i]=1+l[f[i]];
UpDate( idx[i], i );
maxim=( l[i] > l[maxim] ? i : maxim );
}
ofstream out( "scmax.out" );
out<<l[maxim]<<'\n';
Output( maxim, out );
return EXIT_SUCCESS;
}