Pagini recente » Cod sursa (job #462025) | Cod sursa (job #2971484) | Cod sursa (job #2448642) | Cod sursa (job #1177908) | Cod sursa (job #2151746)
#include <fstream>
#include <vector>
std::ifstream fin ("scmax.in");
std::ofstream fout ("scmax.out");
int n, x, i, pos, len = 1;
std::vector <int> v, ind, prev;
/// binary search
inline int upperBound ( int x )
{
int st, dr, mij;
st = 0, dr = len - 1;
while ( st < dr )
{
mij = (st + dr) / 2;
if ( x > v[ ind[mij] ] )
st = mij + 1;
else
dr = mij - 1;
}
return st;
}
void printSol ( int i )
{
if ( i >= 0 )
{
printSol ( prev[i] );
fout << v[i] << " ";
}
}
int main()
{
std::ios::sync_with_stdio (false);
fin >> n;
for ( i = 0; i < n; ++i )
{
fin >> x;
v.push_back( x ), ind.push_back( 0 ), prev.push_back( -1 );
}
for ( i = 1; i < n; ++i )
if ( v[i] <= v[ ind[0] ] )
ind[0] = i;
else if ( v[i] > v[ ind[ len - 1 ] ] )
{
prev[i] = ind[ len - 1 ];
ind [ len++ ] = i;
}
else
{
pos = upperBound( v[i] );
prev[i] = ind[ pos - 1 ];
ind[pos] = i;
}
fout << len << '\n';
printSol ( ind[ len - 1 ] );
}