Cod sursa(job #886682)

Utilizator popacamilpopa camil popacamil Data 23 februarie 2013 09:47:45
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>

using namespace std;

int n,v[100005],best[100005],p[100005],maxim,k,L[100005],nr;

int search(int x){

    int p,u,m;
    p=0;
    u=nr;
    m=(p+u)/2;

    while(p<=u){

        if(v[L[m]]<x && v[L[m+1]]>=x) return m;
        else if(v[L[m+1]]<x){

            p=m+1;
            m=(p+u)/2;

            }
            else{u=m-1;
                m=(p+u)/2;}

    }
    return nr;

}

void afis(int i){

    if(p[i]>0) afis(p[i]);
    printf("%d",v[i]);

}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d",&n);

    for(int i=1;i<=n;++i){

        scanf("%d ",&v[i]);

    }
    best[1]=L[1]=1; L[0]=0;
    int poz;
    nr=1;
    for(int i=2;i<=n;++i){

        poz=search(v[i]);
        p[i]=L[poz];
        best[i]=poz+1;
        L[poz+1]=i;
        if(nr<poz+1) nr=poz+1;
    }
    maxim=0;poz=0;
    for(int i=1;i<=n;++i)
        if(maxim<best[i]){

            maxim=best[i];
            poz=i;

        }
    printf("%d\n",maxim);
    afis(poz);
    return 0;
}