Pagini recente » Cod sursa (job #1720515) | Infoarena Monthly 2014 - Runda 2 | Cod sursa (job #2568327) | Cod sursa (job #829825) | Cod sursa (job #397926)
Cod sursa(job #397926)
#include <fstream>
#include <algorithm>
#define Nmax 100011
/*
*
*/
using namespace std;
int N;
int v[Nmax], v2[Nmax], idx[Nmax], dp[Nmax], aib[Nmax], father[Nmax];
void UpDate( int x, int y )
{
for( ; x <= N; x+=( x & -x ) )
if( dp[aib[x]] < dp[y] )
aib[x]=y;
}
int QueRy( int x )
{
int idx=0;
for( ; x; x-=( x & -x ) )
if( dp[aib[x]] > dp[idx] )
idx=aib[x];
return idx;
}
int search( int x, int idx )
{int tidx, i=0;
for( ; idx; idx>>=1 )
{
tidx=i+idx;
if( tidx <= N && v2[tidx] <= x )
i=tidx;
}
return i;
}
int main( void )
{
int i, max, stop;
ifstream in("scmax.in");
in>>N;
for( i=1; i <= N; ++i )
{
in>>v[i];
v2[i]=v[i];
}
sort( v2+1, v2+N+1 );
for( stop=1; stop <= N; stop<<=1 );
for( i=1; i <= N; ++i )
idx[i]=search( v[i], stop );
for( max=i=1; i <= N; ++i )
{
father[i]=QueRy( idx[i]-1 );
dp[i]=dp[father[i]]+1;
UpDate( idx[i], i );
if( dp[i] > dp[max] )
max=i;
}
for( i=max, max=0; i; i=father[i], ++max )
v2[max]=v[i];
ofstream out("scmax.out");
out<<max<<'\n';
for( i=max-1; i >= 0; --i )
out<<v2[i]<<' ';
return 0;
}