Cod sursa(job #503776)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 24 noiembrie 2010 21:36:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>

int n,nr=1,max,v[100001],d[100001],p[100001],l[100001];

void w(int a)
{
    if (p[a]>0)  w(p[a]);
    printf("%d ",v[a]);
}

int bs(int key)
{
    int st,dr,mid;
    st=0;dr=nr;mid=(st+dr)/2;
    while (st<=dr)
    {
        if ((v[l[mid]]<key)&&(v[l[mid+1]]>=key)) return mid;
        else if (v[l[mid+1]]<key) {st=mid+1;mid=(st+dr)/2;}
        else {dr=mid-1;mid=(st+dr)/2;}
    }
    return nr;
}

int main()
{
    int a,i;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i) scanf("%d",&v[i]);
    d[1]=1;l[1]=1;
    for (i=2;i<=n;++i)
    {
        a=bs(v[i]);
        p[i]=l[a];
        d[i]=a+1;
        l[a+1]=i;
        if (nr<a+1) nr=a+1;
    }
    max=0;a=0;
    for (i=1;i<=n;++i) if (max<d[i]) {max=d[i];a=i;}
    printf("%d\n",max);
    w(a);
    return 0;
}