Cod sursa(job #206489)

Utilizator mika17Mihai Alex Ionescu mika17 Data 7 septembrie 2008 10:54:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#define NMAX 100000

int N,sir[NMAX],lmax,P[NMAX],L[NMAX + 1];

void rd()
{
    freopen("scmax.in","r",stdin);
    scanf("%d",&N);
    for(int i = 0 ; i < N ; scanf("%d",&sir[i++]) );
}

int bsc(int st,int dr,int key)
{
    if(st>dr) return 0;

    int pos = st, bits = st;

    for (; bits <= dr ; bits <<= 1);

    for(; bits ; bits >>= 1)
          if(pos + bits <= dr & sir[L[pos + bits]] < key) pos += bits;
    if(sir[L[pos]] < key) return pos;
       else return 0;
}

void dp()
{
    L[0] = -1;
    for(int i = 0 ; i < N ; ++i)
    {
        int j = bsc(1,lmax,sir[i]);

        P[i] = L[j];

        if(j + 1 > lmax) lmax = j + 1, L[j + 1] = i;
             else if(sir[L[j+1]] > sir[i])
                L[j + 1] = i;
    }
}

void wd()
{
    freopen("scmax.out","w",stdout);
    printf("%d\n",lmax);

    int p = L[lmax], st[NMAX], k = 0;
    while(p != -1)
    {
        st[k++] = sir[p];
        p = P[p];
    }

    while(k--)
        printf("%d ",st[k]);
}

int main()
{
    rd();
    dp();
    wd();
    return 0;
}