Pagini recente » Cod sursa (job #1481535) | jc2018-runda-1 | Cod sursa (job #3160388) | Cod sursa (job #1440393) | Cod sursa (job #2705421)
#include <bits/stdc++.h>
using namespace std;
ifstream in ( "scmax.in" );
ofstream out ( "scmax.out" );
int v[100001],l[100001],vmin[100001];
void subsir ( int p );
int n;
int k,imax,st,dr,m,ans;
int main()
{
in >> n;
for ( int i = 1 ; i <= n ; ++i )
in >> v[i];
l[1] = 1;
k = 1;
vmin[2] = v[1];
imax = 0;
for ( int i = 1 ; i <= n ; ++i )
{
st = 1;
dr = k;
ans = 0;
while ( st <= dr )
{
m = ( st + dr ) / 2;
if ( v[i] > vmin[m] )
{
ans = m;
st = m+1;
}
else
dr = m-1;
}
if ( ans )
{
if ( ans == k )
{
vmin[++k] = v[i];
imax = i;
}
else
vmin[ans+1] = v[i];
}
else
{
if ( v[i] < vmin[1] )
vmin[1] = v[i];
}
l[i] = ans;
}
out << l[imax] << '\n';
subsir ( imax );
return 0;
}
void subsir ( int p )
{
int i = p;
while ( i >= 1 && ( v[i] >= v[p] || l[i] != l[p] - 1 ) )
--i;
if ( i >= 1 )
subsir (i);
out << v[p] << " ";
}