Cod sursa(job #1807278)

Utilizator andreicontorandrei contor andreicontor Data 16 noiembrie 2016 12:04:30
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<cstdio>
using namespace std;
int q,u,c[10001],ok,p,k,n,i,ma,j,a[100001],b[100001];
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    /*for(i=n;i>=1;i--)
    {
        ma=0;
        for(j=i+1;j<=n;j++)
        {
            if(a[i]<a[j])
            if(b[j]>ma)
                ma=b[j];
        }
        b[i]=ma+1;
    }
    ma=0;
    for(i=1;i<=n;i++)
        if(b[i]>ma)
        {
            ma=b[i];
            p=i;
        }
    printf("%d\n",ma);
    k=ma;
    ok=1;
    while(ok<=ma)
    {
        for(i=p;i<=n;i++)
            if(b[i]==k)
            {
                printf("%d ",a[i]);
                p=i;
                k--;
                ok++;
                break;
            }
    }
return 0;
}
*/
    b[n]=1;
    c[1]=a[n];
    q=1;
    for(i=n-1;i>=1;i--)
    {
        if(a[i]>c[1])
        {
            c[1]=a[i];
            b[i]=1;
        }
        else
        if(a[i]<c[q])
        {
            c[q+1]=a[i];
            b[i]=q+1;
            q++;
        }
        else
        {
            p=1;
            u=q;
            while(p<=u)
            {
                k=(u+p)/2;
                if(a[i]<c[k]&&a[i]>=c[k+1])
                {
                    b[i]=k+1;
                    c[k]=a[i];
                    break;
                }
                else
                if(a[i]<c[k])   u=k-1;
                else
                                p=k+1;
            }
            }
        }
    printf("%d\n",q);
    for(i=q;i>=1;i--)
        printf("%d ",c[i]);
    return 0;
}