Cod sursa(job #1413983)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 2 aprilie 2015 11:31:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#define nmax 100005

using namespace std;

int n,a[nmax],t[nmax],l[nmax],v[nmax],nrv,mxm=-1,pozmxm;

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

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

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

void rezolv()
{
    int poz;
    for(int i=1;i<=n;i++)
    {
        poz=caut_bin(a[i]);
        l[i]=poz;
        t[i]=v[poz-1];
        v[poz]=i;
        nrv=maxim(poz,nrv);
        if(l[i]>mxm)
        {
            mxm=l[i];
            pozmxm=i;
        }
    }
}

void afisare(int k)
{
    if(k!=0)
    {
        afisare(t[k]);
        printf("%d ",a[k]);
    }
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    rezolv();
    printf("%d\n",mxm);
    afisare(pozmxm);
    return 0;
}