Cod sursa(job #186903)

Utilizator Mishu91Andrei Misarca Mishu91 Data 29 aprilie 2008 02:08:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>
#define MAX_N 100000

int A[MAX_N],B[MAX_N],C[MAX_N];
int M,N;

int bs(int k)
{
    int li = 0,lf = M,pz = -1;
    while(li <= lf)
    {
        int m = li + ((lf - li) >> 1);
        if(B[m] >= k)
            lf = m - 1,pz = m;
        else
            li = m + 1;
    }
    return pz;
}

void solve()
{
    int i,j,poz;
    scanf("%d\n",&N);
    for(i=0; i<N; i++)
    {
        scanf("%d ",A+i);
        if((poz = bs(A[i])) < 0)
            B[C[i] = M++] = A[i];
        else
            B[C[i] = poz] = A[i];
    }
    printf("%d\n",M);

    for(i = N-1, j = M-1;j >= 0;j--)
    {
        while(C[i] != j)
            i--;
        B[j] = A[i];
    }
    for(i = 0; i<M; i++)
        printf("%d ",B[i]);
}

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