Cod sursa(job #740928)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 24 aprilie 2012 22:28:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>

using namespace std;

int nr,b[100100],a[100100],p[100100],s[100100],i,n,mx,ultimul,pos,lg;

int cautbin(int dr,int x)
{
    int st,mij;
    st=1;
    while (st<=dr){
        mij=(st+dr)/2;
        if (x==s[mij]) return mij;
        if (x<s[mij])
            dr=mij-1;
        else
            st=mij+1;
    }
    return st;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for (i=1;i<=n;i++)
    {
        s[i]=2000000001;
    }
    lg=1;
    s[1]=a[1];
    p[1]=1;
    for (i=2;i<=n;i++)
    {
        p[i]=cautbin(lg,a[i]);
        if (p[i]==1&&a[i]>s[1])
        {
            lg++;
            p[i]=lg;
            s[p[i]]=a[i];
        }
        else
        {
            s[p[i]]=a[i];
            if (p[i]>lg)
                lg=p[i];
        }
    }
    mx=0;
    pos=0;
    for (i=1;i<=n;i++)
    {
        if (p[i]>mx)
        {
            mx=p[i];
            pos=i;
        }
    }
    ultimul=pos;
    printf("%d\n",mx);
    b[1]=a[ultimul];
    nr=1;
    for (i=pos-1;i>=1;i--)
    {
        if (p[i]==p[ultimul]-1&&a[i]<a[ultimul])
        {
            ultimul=i;
            nr++;
            b[nr]=a[ultimul];
        }
    }
    for (i=nr;i>=1;i--)
    {
        printf("%d ",b[i]);
    }
    printf("\n");
    return 0;
}