Cod sursa(job #676739)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 9 februarie 2012 16:04:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>

const int N_MAX = 100010;

int v[N_MAX],n;
int p[N_MAX]; int l_max=0; //p[i] -> pozitia din vectorul v pe care se termina o subsecventa de lungime i; l_max dimensiunea lui p
int pred[N_MAX];

inline int max(int a, int b)
{
    return a>b?a:b;
}

void citeste()
{
    scanf("%d",&n);
    for (int i = 1; i <= n; ++i)
        scanf("%d",&v[i]);
}

int cautare_binara(int i)
{
    int poz = 0;
    for (int pas = 1<<17; pas > 0; pas >>= 1)
        if (poz + pas <= l_max && v[p[poz+pas]] < v[i]) //strict crescator
            poz += pas;
    return poz;
}

void scmax()
{
    //p[0] = 0; v[0] = 0;
    int l;
    for (int i = 1; i <= n; ++i)
    {
        l = cautare_binara(i);
        pred[i] = p[l];
        p[l+1] = i;
        l_max = max(l_max,l+1);
    }
}

void scrie_subsir(int i)
{
    if (pred[i] != 0)
        scrie_subsir(pred[i]);
    printf("%d ",v[i]);
}

void scrie()
{
    printf("%d\n",l_max);
    scrie_subsir(p[l_max]);
}

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