Cod sursa(job #1728609)

Utilizator silkMarin Dragos silk Data 13 iulie 2016 13:09:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#define NMax 100005

int V[NMax];
int P[NMax];
int Q[NMax];
int i,n,lgmax;

void Read()
{
    scanf("%d",&n);
    for( int i = 1; i <= n; ++i ) scanf("%d",&V[i]);
}

void Write()
{
    int i,K;

    printf("%d\n",lgmax);
    for( K = n ,i = lgmax; i >= 1; --i  )
    {
        while( P[K] != i ) --K;
        Q[i] = V[K];
    }

    for( i = 1; i <= lgmax; ++i ) printf("%d ",Q[i]);
}

void Solve()
{
    int i,st,dr,mid,pos;

    lgmax = 0;
    for( i = 1; i <= n; ++i )
    {
        for( pos = -1, st = 1, dr = lgmax; st <= dr; )
        {
            mid = (st+dr)/2;
            if( V[i] > Q[mid] ) st = mid + 1;
            else { pos = mid; dr = mid - 1; }
        }

        if( pos == -1 ) { Q[++lgmax] = V[i]; P[i] = lgmax; }
        else { Q[pos] = V[i]; P[i] = pos; }
    }
}

int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

   Read();
   Solve();
   Write();


return 0;
}