Pagini recente » Cod sursa (job #3282174) | Cod sursa (job #985526) | Cod sursa (job #1429768) | Cod sursa (job #1795829) | Cod sursa (job #744486)
Cod sursa(job #744486)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
#define NMAX 100005
#define PII pair< int, int >
#define val first
#define pos second
#define Bit(x) ( x&(-x) )
int N, i, LgMax, Ct, CapatSir;
PII A[NMAX];
int ValNorm[NMAX];
int ValAfis[NMAX];
int D[NMAX];
int AIB[NMAX];
ifstream in("scmax.in");
ofstream out("scmax.out");
inline int Query( int Pos )
{
int LgRezMax = 0;
for( int ii = Pos; ii; ii -= Bit( ii ) )
LgRezMax = max( LgRezMax, AIB[ii] );
return LgRezMax;
}
inline void Update( int Pos, int Val )
{
for( int ii = Pos; ii <= N; ii += Bit( ii ) )
AIB[ii] = max( AIB[ii], Val );
}
inline void Afis( int Ind, int Lg, int Val )
{
if( Lg )
{
if( D[Ind] == Lg && ValNorm[ Ind ] <= Val )
{
Afis( Ind - 1, Lg - 1, ValNorm[ Ind ] - 1 );
out << ValAfis[ ValNorm[ Ind ] ] << ' ';
}
else
Afis( Ind - 1, Lg, Val );
}
}
int main()
{
in >> N;
A[0].val = 0;
for( i = 1; i <= N; ++i )
{
in >> A[i].val;
A[i].pos = i;
}
sort( A + 1, A + N+1 );
for( Ct = 0, i = 1; i <= N; ++i )
ValNorm[ A[i].pos ] = ( A[i].val == A[i-1].val ) ? Ct : ++Ct,
ValAfis[ Ct ] = A[i].val;
memset( AIB, 0, sizeof(AIB) );
memset( D, 0, sizeof(D) );
LgMax = 0;
for( i = 1; i <= N; ++i )
{
D[i] = Query( ValNorm[i] - 1 ) + 1;
if( D[i] > LgMax )
LgMax = D[i], CapatSir = i;
Update( ValNorm[i], D[i] );
}
out << LgMax << '\n';
Afis( CapatSir, LgMax, ValNorm[ CapatSir ] );
out << '\n';
return 0;
}