Cod sursa(job #1465606)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 27 iulie 2015 18:22:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#define nmax 100005

using namespace std;

int n,a[nmax],t[nmax],l[nmax],v[nmax],st[nmax],vf,nrv;

void citire()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
}

int caut_bin(int k)
{
    int m,li=1,lf=nrv;
    while(li<=lf)
    {
        m=(li+lf)/2;
        if(a[v[m]]==a[k])
            return m;
        if(a[v[m]]<a[k])
        {
            li=m+1;
            continue;
        }
        lf=m-1;
    }
    return li;
}

int maxim(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

void rezolv()
{
    for(int i=1;i<=n;i++)
    {
        int k=caut_bin(i);
        l[i]=k;
        t[i]=v[k-1];
        v[k]=i;
        nrv=maxim(nrv,k);
    }
    int mxm=-1,pozmxm;
    for(int i=1;i<=n;i++)
        if(l[i]>mxm)
        {
            mxm=l[i];
            pozmxm=i;
        }
    st[++vf]=pozmxm;
    int i=pozmxm;
    while(t[i]!=0)
        st[++vf]=i=t[i];
}

void afisare()
{
    printf("%d\n",vf);
    for(int i=vf;i>=1;i--)
        printf("%d ",a[st[i]]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    rezolv();
    afisare();
    return 0;
}