Pagini recente » Cod sursa (job #1598173) | Cod sursa (job #1931828) | Cod sursa (job #708134) | Cod sursa (job #1662335) | Cod sursa (job #1345637)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
const int nmax = 100000;
int val[ nmax + 1 ];
int n, d[ nmax + 1 ], aib[ nmax + 1 ], v[ nmax + 1 ], r[ nmax + 1 ];
inline int lsb( int x ) {
return x & -x;
}
void update( int pos, int x ) {
for( int i = pos; i <= n; i += lsb( i ) ) {
if ( d[ aib[ i ] ] < d[ x ] ) {
aib[ i ] = x;
}
}
}
int query( int val ) {
int sol = 0;
for( int i = val; i > 0; i -= lsb( i ) ) {
if ( d[ sol ] < d[ aib[ i ] ] ) {
sol = aib[ i ];
}
}
return sol;
}
void afis( int pos ) {
if ( pos > 0 ) {
afis( r[ pos ] );
fout << val[ pos ] << " ";
}
}
void normalizare() {
vector <int> aux( val + 1, val + n + 1 );
sort( aux.begin(), aux.end() );
aux.erase( unique( aux.begin(), aux.end() ), aux.end() );
for( int i = 1; i <= n; ++ i ) {
v[ i ] = lower_bound( aux.begin(), aux.end(), val[ i ] ) - aux.begin() + 1;
}
}
int main() {
int ans;
fin >> n;
ans = 0;
for( int i = 1; i <= n; ++ i ) {
fin >> val[ i ];
}
normalizare();
for( int i = 1; i <= n; ++ i ) {
r[ i ] = query( v[ i ] - 1 );
d[ i ] = d[ r[ i ] ] + 1;
if ( d[ i ] > d[ ans ] ) {
ans = i;
}
update( v[ i ], i );
}
fout << d[ ans ] << "\n";
afis( ans );
fout << "\n";
fin.close();
fout.close();
return 0;
}