Pagini recente » Cod sursa (job #611157) | Cod sursa (job #1690955) | Cod sursa (job #3287630) | Cod sursa (job #2069560) | Cod sursa (job #2554095)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
vector < int > v;
int a[100005], prec[100005], nr[100005], R[100005];
int main()
{
int n, i, st, dr, mij, r, x;
fin >> n;
for ( i = 1 ; i <= n ; i++ ) fin >> a[i];
v.push_back ( 1 );
nr[1] = 1;
for ( i = 2 ; i <= n ; i++ )
{
if ( a[i] > a[v[v.size()-1]] ) prec[i] = v[v.size()-1], nr[i] = nr[prec[i]] + 1, v.push_back ( i );
else
{
st = 0;
dr = v.size() - 1;
r = dr;
while ( st <= dr )
{
mij = ( st + dr ) / 2;
if ( a[v[mij]] >= a[i] ) r = mij, dr = mij - 1;
else st = mij + 1;
}
v[r] = i;
if ( r == 0 ) prec[i] = -1, nr[i] = 1;
else prec[i] = v[r-1], nr[i] = nr[prec[i]] + 1 ;
}
}
fout << v.size() << '\n';
for ( i = 1 ; i <= n ; i++ )
if ( nr[i] == v.size() )
{
r = i;
break;
}
i = 0;
x = r;
while ( x != -1 )
{
R[++i] = a[x];
x = prec[x];
}
for ( i = v.size() ; i > 0 ; i-- ) fout << R[i] << ' ';
return 0;
}