Cod sursa(job #1414124)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 2 aprilie 2015 13:11:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>

using namespace std;

int a[100002],b[100002],p[100002],s[100002],i,n,lg,mx,pos,ans,aux;

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]);
    }
    lg=1;
    s[1]=a[1];
    p[1]=1;
    for(i=2;i<=n;i++)
    {
        p[i]=cautbin(lg,a[i]);
        s[p[i]]=a[i];
        if(p[i]==1&&a[i]>s[1])
        {
            p[i]=++lg;
        }
        else
        {
            if(p[i]>lg)
            {
                lg=p[i];
            }
        }
    }
    mx=0;
    for(i=1;i<=n;i++)
    {
        if(p[i]>mx)
        {
            mx=p[i];
            pos=i;
        }
    }
    printf("%d\n",mx);
    b[1]=a[pos];
    aux=pos;
    ans=1;
    for(i=pos-1;i>=1;i--)
    {
        if(p[i]==p[aux]-1&&a[i]<a[aux])
        {
            b[++ans]=a[i];
            aux=i;
        }
    }
    for(i=ans;i>=1;i--)
    {
        printf("%d ",b[i]);
    }
}