Cod sursa(job #367764)

Utilizator cristiprgPrigoana Cristian cristiprg Data 23 noiembrie 2009 14:22:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#define DIM 100005
int n, v[DIM], p[DIM], q[DIM], L;

void citire()
{
    FILE *f = fopen("scmax.in", "r");
    fscanf(f, "%d", &n);
    for (int i = 1; i <= n; ++i)
        fscanf(f, "%d", &v[i]);

    fclose(f);
}

int caut(int z[], int x, int st, int dr)
{

    if (dr <= st)
    {

        if (dr == st && z[st] >= x)
            return st;



        return -1;
    }

    int m = st + (dr - st)/2;

    if (z[m] >= x)
        return caut(z, x, st, m);
    else
        return caut(z, x, m + 1, dr);
}

void solve()
{
    for (int i = 1, poz; i <= n; ++i)
    {
        poz = caut(q, v[i], 1, L);

        if (poz != -1)
            q[poz] = v[i], p[i] = poz;
        else
            q[++L] = v[i], p[i] = L;
    }
}

void afisare(FILE *f, int i, int l)
{
    if (!l)
        return;

    if (p[i] != l)
        afisare(f, i-1, l);
    else
        afisare(f, i-1, l-1), fprintf(f, "%d ", v[i]) ;

}

int main()
{
    citire();
    solve();
    FILE *f = fopen("scmax.out", "w");
    fprintf (f, "%d\n", L);
    afisare(f, n, L);
    fclose(f);
    return 0;
}