Cod sursa(job #897340)

Utilizator paulbotabota paul paulbota Data 27 februarie 2013 20:03:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#define MAXN 100010

int v[MAXN],prev[MAXN],bst[MAXN],n,nr,sf[MAXN];


int caut_bin(int x)
{
    int p=0,u=nr,m;
    m=(p+u)/2;
    while(p<=u)
    {
        if(v[sf[m]]<x && v[sf[m+1]] >=x) return m;
        else if(v[sf[m+1]]<x)
            {
                p=m+1;
                m=(p+u)/2;
            }
            else
            {
                u=m-1;
                m=(p+u)/2;
            }

    }
    return nr;
}

void afis(int pos)
{
    if(prev[pos]>0)
        afis(prev[pos]);
    printf("%d ",v[pos]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    nr=1;
    bst[1]=1;
    sf[1]=1;
    sf[0]=0;
    int pos;
    for(i=2;i<=n;i++)
    {
        pos=caut_bin(v[i]);
        prev[i]=sf[pos];
        bst[i]=pos+1;
        sf[pos+1]=i;
        if(nr<pos+1)
            nr=pos+1;
    }
    int maxim=0;
    for(i=1;i<=n;i++)
        if(maxim<bst[i])
        {
            maxim=bst[i];
            pos=i;
        }
    printf("%d\n",maxim);
    afis(pos);
    printf("\n");
    return 0;
}