Cod sursa(job #750468)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 22 mai 2012 10:36:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
#define inf 2000000010
using namespace std;
int i, a[100001], p[100001], q[100001], n, m;
int cb(int x, int st, int dr)
{
    int mij, pz;
    pz=0;
    while ((st<=dr)&&(pz==0))
    {
        mij=(st+dr)/2;
        if (q[mij]==x) pz=mij;
        else if (q[mij]<x) st=mij+1;
        else dr=mij-1;
    }
    if (pz==0) return st;
    else return pz;
}
void scrie(int poz, int x, int ult)
{
    if (poz>0)
    {
        if ((p[poz]==x)&&(ult>a[poz]))
        {
            scrie(poz-1, x-1, a[poz]);
            printf("%d ", a[poz]);
        }
        else scrie(poz-1, x, ult);
    }
}
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]);
        p[i]=0;
        q[i]=0;
    }
    p[1]=1;
    q[0]=1;
    q[1]=a[1];
    for (i=2; i<=n; i++)
    {
        m=cb(a[i], 1, q[0]);
        if (m>q[0])
        {
            q[0]++;
            p[i]=q[0];
            q[q[0]]=a[i];
        }
        else
        {
            q[m]=a[i];
            p[i]=m;
        }
    }
    printf("%d\n", q[0]);
    scrie(n, q[0], inf);
    return 0;
}