Pagini recente » Cod sursa (job #2136743) | Cod sursa (job #1649115) | Cod sursa (job #2741633) | Cod sursa (job #146670) | Cod sursa (job #175746)
Cod sursa(job #175746)
#include <iostream>
#include <math.h>
#define FIN "scmax.in"
#define FOUT "scmax.out"
int n,t;
int *read_data(int &n)
{
freopen( FIN , "r" , stdin );
scanf ( "%d" , &n );
int *S=new int[n];
for ( int i=0 ; i<n ; i++ ) scanf ("%d" , &S[i] );
fclose( stdin );
return S;
}
int write_data ( int *T )
{
freopen ( FOUT , "w" , stdout );
printf ( "%d\n" , ++t );
for ( int i=0 ; i<t ; i++ )
printf ( (i<t-1)?"%d ":"%d\n" , T[i] );
fclose ( stdout );
return 0;
}
int search ( int v , int *T , int n )
{
int pas,poz=0;
pas = 1<<(int)log(n);
while (pas)
{
while ( pas && T[poz+pas]>v ) pas>>=1;
poz+=pas;
}
}
int *solve ( int *S )
{
int *T=new int[n];
int *V=new int [n];
int v=-1,max,p,i;
for ( i=0,t=-1 ; i<n ; i++ )
{
if ( t<0 || S[i]>T[t] ) T[v=++t]=S[i]; else
T[v=search(S[i],T,t)] = S[i];
V[i]=v;
if (v>max) max=v,p=i;
}
T[max]=S[p];
for ( v=max-1 , i=p-1 ; i+1 ; i-- )
if ((T[v+1]>S[i])&&(V[i]+1==V[p]))
T[v--]=S[p=i];
t=max;
return T;
}
int main ()
{
return write_data( solve( read_data(n) ) );
}