Cod sursa(job #895716)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 27 februarie 2013 12:20:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

using namespace std;
int a[100010],q[100010],p[100010],i,nr,poz,max,n,b[100010],n1;
int caut_bin(int x, int st, int dr)
{
    int m;
    while (st<=dr && q[m]!=x)
    {
        m=(st+dr)/2;
        if (q[m]==x) return m;
        else
            if (q[m]>x) dr=m-1;
        else
            st=m+1;
    }
    return st;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d\n",&n);
    for (i=1; i<=n; i++)
        scanf("%d ",&a[i]);
    q[1]=a[1];
    p[1]=1;
    nr=1;

    for (i=2; i<=n; i++)
    {
        poz=caut_bin(a[i],1,nr);
        if (poz>nr) {q[++nr]=a[i];}
        q[poz]=a[i];
        p[i]=poz;
        if (p[i]>max) max=p[i];
    }

    printf("%d\n",max);

    for (i=n; i>=1; i--)
        if (p[i]==max && max!=0)
        {
            b[++n1]=a[i];
            max--;
        }
    for (i=n1; i>=1; i--)
        printf("%d ",b[i]);
    return 0;
}