Pagini recente » Cod sursa (job #542260) | Cod sursa (job #163414) | Cod sursa (job #1372380) | Cod sursa (job #2186169) | Cod sursa (job #183033)
Cod sursa(job #183033)
#include <iostream>
#include <math.h>
#define FI "scmax.in"
#define FO "scmax.out"
#define INF 0x3f3f3f3f
#define MAXN 100001
int N[MAXN],T[MAXN],V[MAXN],n;
void read_data()
{
freopen ( FI , "r" , stdin );
scanf ( "%d" , &n );
for ( int i=0 ; i<n ; i++ ) scanf ( "%d" , &N[i] );
fclose ( stdin );
}
void write_data(int t)
{
int v;
freopen ( FO , "w" , stdout );
printf ( "%d\n" , t );N[n]=INF;
for ( V[v=t]=INF ; t ; V[--t] = N[n] )
while ( T[n]+1 != t || N[n] >= V[t] )
n--;
for ( t=0 ; t<v ; t++ )
printf ( (t+1<v)?"%d ":"%d\n" , V[t] );
fclose ( stdout );
}
int search ( int x ,int max )
{
int p,pas = (int) log2(max);
for ( p=0 ; pas ; pas>>=1 )
{
while ( pas && V[p+pas]>x ) pas>>=1;
p+=pas;
}
return p;
}
void solve()
{
int i,p,max;
for ( V[max=0]=N[0],i=1 ; i<n ; i++ )
{
if (V[max]<N[i]) V[T[i]=++max]=N[i]; else
V[T[i]=search(N[i],max+1)] = N[i];
}
write_data(max+1);
}
int main()
{
read_data();
solve();
return 0;
}