Cod sursa(job #899210)

Utilizator timicsIoana Tamas timics Data 28 februarie 2013 13:20:10
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
int a[100010],b[100010],s[100010],N,k=1;
int caut(int x)
{
    int st=1;
    int dr=k;
    int ret=1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(b[mij]>=x)
        {
            ret=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return ret;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&N);
    for(int i=1;i<=N;++i)
        scanf("%d",&a[i]);
    s[1]=1;
    b[1]=a[1];
    for(int i=2;i<=N;++i)
    {
        if(a[i]>b[k])
        {
            ++k;
            s[i]=k;
            b[k]=a[i];
        }
        else
        {
            s[i]=caut(a[i]);
            b[k]=a[i];
        }
    }
    printf("%d\n",k);
    int x=k;
    for(int i=N;i>=1;--i)
    {
        if(s[i]==k)
        {
            b[k]=a[i];
            --k;
        }
    }
    for(int i=1;i<=x;++i)
        printf("%d ",b[i]);
    return 0;
}