Cod sursa(job #1649822)

Utilizator feli2felicia iuga feli2 Data 11 martie 2016 15:15:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int n, a[100005], L[100005], r[100005], nr, t[100005], mxi;

int cauta(int x)
{
    int p, m, u;
    p=0;
    u=nr;
    while(p<=u)
    {
        m=(u+p)/2;
        if(a[L[m]]<x&&a[L[m+1]]>=x)
        {
            return m;
        }
        else
            if(a[L[m+1]]<x)
                p=m+1;
        else
            if(a[L[m]]>=x)
                u=m-1;
    }
    return nr;
}

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]);
    }
    L[1]=1;
    nr=1;
    mxi=1;
    for(int i=2;i<=n;i++)
    {
        int lung=cauta(a[i]);
        L[lung+1]=i;
        t[i]=L[lung];
        if(lung+1>nr)
        {
            nr=lung+1;
            mxi=i;
        }
    }
    printf("%d\n",nr);
    int i=mxi, in=0;
    while(i)
    {
        in++;
        r[in]=a[i];
        i=t[i];
    }
    while(in)
    {
        printf("%d ",r[in]);
        in--;
    }
    return 0;
}