Pagini recente » Clasament testtest1 | Cod sursa (job #961857) | Cod sursa (job #1951568) | Cod sursa (job #2106571) | Cod sursa (job #2376640)
#include <bits/stdc++.h>
#define N 100005
#define inf ( 1 << 30 )
using namespace std;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
int n;
int a[N];
int best[N], last;
int prec[N];
void read()
{
int i;
fin >> n;
for ( i = 1; i <= n; ++i )
fin >> a[i];
fin.close();
}
int CB( int s, int d, int poz )
{
if ( s > d ) return 0;
int m = ( s + d ) / 2;
if ( a[poz] > a[best[m]] )
return max( m, CB( m + 1, d, poz ) );
else return CB( s, m - 1, poz );
}
void out( int poz )
{
if ( prec[poz] )
out( prec[poz] );
fout << a[poz] << ' ';
}
void solve()
{
int i;
a[0] = -inf;
a[n+1] = inf;
last = 0;
best[last] = 0;
for ( i = 1; i <= n; ++i )
if ( a[i] > a[best[last]] )
{
best[++last] = i;
prec[i] = best[last-1];
}
else
{
int poz = CB( 1, last, i );
best[poz+1] = i;
prec[i] = best[poz];
}
fout << last << '\n';
out( best[last] );
}
int main()
{
read();
solve();
fout.close();
return 0;
}